/ Hex Artifact Content
Login

Artifact 251147ba6268b673101b9fdacdd9277da37c12f4:


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 28 70 20 26 26 20 70 2d  return ((p && p-
0720: 3e 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20  >isPrepareV2) ? 
0730: 70 2d 3e 7a 53 71 6c 20 3a 20 30 29 3b 0a 7d 0a  p->zSql : 0);.}.
0740: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0750: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0760: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
0770: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
0780: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
0790: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07a0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07b0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07c0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
07d0: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
07e0: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
07f0: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0800: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0810: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0820: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0830: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0840: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0850: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0860: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
0870: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
0880: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
0890: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08a0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08b0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08c0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
08d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
08e0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  EBUG./*.** Turn 
08f0: 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  tracing on or of
0900: 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  f.*/.void sqlite
0910: 33 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20  3VdbeTrace(Vdbe 
0920: 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29  *p, FILE *trace)
0930: 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74  {.  p->trace = t
0940: 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  race;.}.#endif..
0950: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0960: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
0970: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
0980: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61   least one op la
0990: 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74  rger than .** it
09a0: 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   was..**.** If a
09b0: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
09c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
09d0: 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20  le resizing the 
09e0: 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a  array, return.**
09f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49   SQLITE_NOMEM. I
0a00: 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65  n this case Vdbe
0a10: 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f  .aOp and Vdbe.nO
0a20: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a30: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a40: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a50: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a60: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a70: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a80: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0a90: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0aa0: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0ac0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 29  OpArray(Vdbe *p)
0ad0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77  {.  VdbeOp *pNew
0ae0: 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28  ;.  int nNew = (
0af0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
0b00: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69  >nOpAlloc*2 : (i
0b10: 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28  nt)(1024/sizeof(
0b20: 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op)));.  pNew = 
0b30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0b40: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  (p->db, p->aOp, 
0b50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0b60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0b70: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0b80: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0b90: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0ba0: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0bb0: 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     p->aOp = pNew
0bc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0bd0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0be0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
0c00: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0c10: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0c20: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0c30: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0c40: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
0c50: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0c60: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
0c70: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
0c80: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
0ca0: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
0cb0: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
0cc0: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
0cd0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
0ce0: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
0cf0: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
0d00: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
0d10: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0d20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0d30: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0d40: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0d50: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0d60: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
0d70: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0d80: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0d90: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
0da0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0db0: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
0dc0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0dd0: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
0de0: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
0df0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0e00: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
0e10: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0e20: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0e30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
0e40: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
0e50: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0e60: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
0e70: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
0e80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
0e90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0ea0: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
0eb0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0ec0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29  p->opcode = (u8)
0ed0: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
0ee0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
0ef0: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
0f00: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
0f10: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
0f20: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
0f30: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
0f40: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0f50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0f60: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
0f70: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
0f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
0f90: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
0fa0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0fb0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0fc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
0fd0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
0fe0: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
0ff0: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1000: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1010: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1020: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1030: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1040: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1050: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1060: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
1070: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
1080: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1090: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
10c0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
10d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
10e0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
10f0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1100: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1110: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1120: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1130: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1140: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1150: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1160: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1170: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1180: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1190: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11a0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
11b0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
11c0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
11d0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
11e0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
11f0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1200: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1210: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1230: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1240: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1250: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1260: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1270: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1280: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1290: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
12a0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
12b0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
12c0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
12f0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1300: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1310: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1320: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1330: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1340: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1350: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1360: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1370: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1380: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1390: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
13a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
13b0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
13c0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
13f0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1400: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1410: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1420: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1430: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1440: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1460: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1470: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1490: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
14a0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
14b0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
14c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
14d0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
14e0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
14f0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1500: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1510: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1540: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1550: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1560: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1570: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1580: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1590: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
15a0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
15b0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
15c0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
15d0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
15e0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
15f0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1600: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1610: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1620: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1630: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1640: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1650: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1660: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1670: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1680: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1690: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
16a0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
16b0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
16c0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
16d0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
16e0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
16f0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1700: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1710: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1720: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1730: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1740: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1750: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1760: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1770: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1780: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1790: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
17a0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
17b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
17c0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29  keLabel(Vdbe *p)
17d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
17e0: 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20   p->nLabel++;.  
17f0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1800: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1810: 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  T );.  if( i>=p-
1820: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a  >nLabelAlloc ){.
1830: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e      int n = p->n
1840: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35  LabelAlloc*2 + 5
1850: 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  ;.    p->aLabel 
1860: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1870: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
1880: 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20  p->aLabel,.     
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c    n*sizeof(p->aL
18c0: 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70  abel[0]));.    p
18d0: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20  ->nLabelAlloc = 
18e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
18f0: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ize(p->db, p->aL
1900: 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e  abel)/sizeof(p->
1910: 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a  aLabel[0]);.  }.
1920: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1930: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1940: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
1950: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
1960: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1970: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1980: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1990: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
19a0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
19b0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
19c0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
19d0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
19e0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
19f0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1a00: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
1a10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1a20: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a30: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b  Vdbe *p, int x){
1a40: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
1a50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
1a60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1a70: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
1a80: 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e  ( j>=0 && j<p->n
1a90: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70  Label );.  if( p
1aa0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1ab0: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70  p->aLabel[j] = p
1ac0: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  ->nOp;.  }.}..#i
1ad0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ae0: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
1af0: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
1b00: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
1b10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
1b20: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
1b30: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
1b40: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
1b50: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
1b60: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
1b70: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
1b80: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
1b90: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
1ba0: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
1bb0: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
1bc0: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
1bd0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
1be0: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
1bf0: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
1c00: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
1c10: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
1c20: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
1c30: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
1c40: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1c60: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
1c70: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
1c80: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
1c90: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
1ca0: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
1cb0: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
1cc0: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
1cd0: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
1ce0: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
1cf0: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
1d00: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
1d10: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
1d20: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
1d30: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d50: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
1d60: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
1d70: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
1d80: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
1d90: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1da0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
1db0: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1de0: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
1df0: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e10: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
1e20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
1e30: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
1e40: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
1e50: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
1e60: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
1e70: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
1e80: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
1e90: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
1ea0: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
1eb0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
1ec0: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
1ed0: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
1ee0: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
1ef0: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
1f00: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
1f10: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
1f20: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
1f30: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
1f40: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
1f50: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
1f60: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
1f70: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
1f80: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
1f90: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
1fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
1fb0: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
1fc0: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
1fd0: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
1fe0: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
1ff0: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2000: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2010: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2020: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2030: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2040: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
2050: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
2060: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
2070: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
2080: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
2090: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
20a0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
20b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
20c0: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
20d0: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
20e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
20f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2100: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2110: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2120: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2130: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2140: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
2150: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
2160: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2170: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
2180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2190: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
21a0: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
21b0: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
21c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21e0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
21f0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2200: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2210: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2220: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2230: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2240: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
2250: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
2260: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
2270: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2280: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2290: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
22a0: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
22b0: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
22c0: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
22d0: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
22e0: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
22f0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2300: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2310: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2320: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2330: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2340: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2350: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2360: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2370: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2380: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2390: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
23a0: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
23c0: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
23d0: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
23e0: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
23f0: 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63  nt).**.** Then c
2400: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
2410: 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79  lue of Parse.may
2420: 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69 66  Abort is true if
2430: 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79   an.** ABORT may
2440: 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66   be thrown, or f
2450: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
2460: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
2470: 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c  t does.** match,
2480: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
2490: 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ise. This functi
24a0: 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  on is intended t
24b0: 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  o be used as.** 
24c0: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
24d0: 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  t statement in t
24e0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d  he compiler. Sim
24f0: 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
2500: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2510: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
2520: 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  rt(pParse->pVdbe
2530: 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  , pParse->mayAbo
2540: 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71  rt) );.*/.int sq
2550: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
2560: 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c  ayAbort(Vdbe *v,
2570: 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a   int mayAbort){.
2580: 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d    int hasAbort =
2590: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
25a0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
25b0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
25c0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
25d0: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
25e0: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
25f0: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2600: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
2610: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
2620: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
2630: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2640: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
2650: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2660: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2670: 65 6e 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53  ename .#ifndef S
2680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
2690: 47 4e 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28  GN_KEY.     || (
26a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75  opcode==OP_FkCou
26b0: 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d  nter && pOp->p1=
26c0: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31  =0 && pOp->p2==1
26d0: 29 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c  ) .#endif.     |
26e0: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
26f0: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
2700: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
2710: 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31       && (pOp->p1
2720: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
2730: 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  INT && pOp->p2==
2740: 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29  OE_Abort)).    )
2750: 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74  {.      hasAbort
2760: 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
2770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
2780: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2790: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
27a0: 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ;..  /* Return t
27b0: 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d  rue if hasAbort=
27c0: 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66  =mayAbort. Or if
27d0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
27e0: 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20  e occured..  ** 
27f0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
2800: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
2810: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
2820: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
2830: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
2840: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
2850: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
2860: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
2870: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
2880: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
2890: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
28a0: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
28b0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
28c0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
28d0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
28e0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
28f0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
2900: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
2910: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2920: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
2930: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2940: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
2950: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
2960: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
2970: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
2980: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
2990: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
29a0: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
29b0: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
29c0: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
29d0: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
29e0: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
29f0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
2a00: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
2a10: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
2a20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a30: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
2a40: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
2a50: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
2a60: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
2a70: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
2a80: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
2a90: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
2aa0: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
2ab0: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
2ac0: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
2ad0: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
2ae0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
2af0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
2b00: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
2b10: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
2b20: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
2b30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f  ..**.** The Op.o
2b40: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20  pflags field is 
2b50: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64  set on all opcod
2b60: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
2b70: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
2b80: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
2b90: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
2ba0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2bb0: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
2bc0: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
2bd0: 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  Op;.  int *aLabe
2be0: 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20  l = p->aLabel;. 
2bf0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31   p->readOnly = 1
2c00: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
2c10: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
2c20: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
2c30: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
2c40: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
2c50: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
2c60: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
2c70: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
2c80: 5d 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ];.    if( opcod
2c90: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c  e==OP_Function |
2ca0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67  | opcode==OP_Agg
2cb0: 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66  Step ){.      if
2cc0: 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72  ( pOp->p5>nMaxAr
2cd0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
2ce0: 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c  pOp->p5;.    }el
2cf0: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
2d00: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26  P_Transaction &&
2d10: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 7b 0a 20   pOp->p2!=0 ){. 
2d20: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
2d30: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2d40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d50: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
2d60: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d70: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
2d80: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
2d90: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2da0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2db0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2dc0: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
2dd0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2de0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
2df0: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
2e00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
2e10: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
2e20: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
2e30: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
2e40: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
2e50: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
2e60: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
2e70: 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  }..    if( (pOp-
2e80: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
2e90: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
2ea0: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
2eb0: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
2ec0: 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  p2<p->nLabel );.
2ed0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
2ee0: 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70  aLabel[-1-pOp->p
2ef0: 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  2];.    }.  }.  
2f00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
2f10: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  >db, p->aLabel);
2f20: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
2f30: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2f40: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 7d  gs = nMaxArgs;.}
2f50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f60: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2f70: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2f80: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2f90: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2fa0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2fb0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
2fc0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2fd0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2fe0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
2ff0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
3000: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3010: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3020: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
3030: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
3040: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
3050: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3060: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
3070: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
3080: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3090: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
30a0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
30b0: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
30c0: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
30d0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
30e0: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
30f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
3100: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
3110: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
3120: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3130: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
3140: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
3150: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
3160: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
3170: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
3180: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
3190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
31a0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
31b0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
31c0: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
31d0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
31e0: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
31f0: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
3200: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
3210: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
3220: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3230: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3240: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3250: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3270: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3280: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3290: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
32a0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
32b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
32c0: 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d 75  t( p->aMutex.nMu
32d0: 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73  tex==0 );..  res
32e0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
32f0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
3300: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
3310: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
3320: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3330: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3340: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3350: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3360: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3370: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3380: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3390: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
33a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
33b0: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
33c0: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
33d0: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
33e0: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
33f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3400: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3410: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
3420: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
3430: 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f  OpAlloc && growO
3440: 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20  pArray(p) ){.   
3450: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
3460: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   addr = p->nOp;.
3470: 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70    if( ALWAYS(nOp
3480: 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >0) ){.    int i
3490: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
34a0: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
34b0: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
34c0: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
34d0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
34e0: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
34f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
3500: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
3510: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
3520: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
3530: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
3540: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
3550: 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20      if( p2<0 && 
3560: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72  (sqlite3OpcodePr
3570: 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63  operty[pOut->opc
3580: 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  ode] & OPFLG_JUM
3590: 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P)!=0 ){.       
35a0: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72   pOut->p2 = addr
35b0: 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20   + ADDR(p2);.   
35c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35d0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b    pOut->p2 = p2;
35e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
35f0: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70  Out->p3 = pIn->p
3600: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  3;.      pOut->p
3610: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3620: 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  ED;.      pOut->
3630: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  p4.p = 0;.      
3640: 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69  pOut->p5 = 0;.#i
3650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3660: 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43  G.      pOut->zC
3670: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  omment = 0;.    
3680: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
3690: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
36a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36b0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
36c0: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
36d0: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
36e0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
36f0: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
3700: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
3710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
3720: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3730: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
3740: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
3750: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
3760: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3770: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
3780: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
3790: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
37a0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
37b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37c0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
37d0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
37e0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
37f0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
3800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3810: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
3820: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
3830: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
3840: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
3850: 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a  ert( addr>=0 );.
3860: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64    if( p->nOp>add
3870: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3880: 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a  addr].p1 = val;.
3890: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
38a0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
38b0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
38c0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
38d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
38e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
38f0: 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e  seful for settin
3900: 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  g a jump destina
3910: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3920: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3930: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  2(Vdbe *p, int a
3940: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3950: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3960: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
3970: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  =0 );.  if( p->n
3980: 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  Op>addr ){.    p
3990: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
39a0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
39b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
39c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
39d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
39e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
39f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3a00: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
3a10: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
3a20: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
3a30: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
3a40: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29  ssert( addr>=0 )
3a50: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61  ;.  if( p->nOp>a
3a60: 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ddr ){.    p->aO
3a70: 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c  p[addr].p3 = val
3a80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3a90: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
3aa0: 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e  of the P5 operan
3ab0: 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  d for the most r
3ac0: 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64  ecently.** added
3ad0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76   operation..*/.v
3ae0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3af0: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c  hangeP5(Vdbe *p,
3b00: 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65   u8 val){.  asse
3b10: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3b20: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
3b30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
3b40: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70   );.    p->aOp[p
3b50: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61  ->nOp-1].p5 = va
3b60: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3b70: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
3b80: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
3b90: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
3ba0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
3bb0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
3bc0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
3bd0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
3be0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3bf0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
3c00: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3c10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
3c20: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
3c30: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
3c40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
3c50: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
3c60: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
3c70: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
3c80: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
3c90: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
3ca0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
3cb0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
3cc0: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
3cd0: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
3ce0: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
3cf0: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57  pDef){.  if( ALW
3d00: 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44  AYS(pDef) && (pD
3d10: 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  ef->flags & SQLI
3d20: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
3d30: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
3d40: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29  DbFree(db, pDef)
3d50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
3d60: 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65  elete a P4 value
3d70: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
3d80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
3d90: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
3da0: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
3db0: 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70  id *p4){.  if( p
3dc0: 34 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  4 ){.    switch(
3dd0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
3de0: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
3df0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
3e00: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
3e10: 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20 20  4_MPRINTF:.     
3e20: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
3e30: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3e40: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
3e50: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
3e60: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
3e70: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
3e80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3e90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
3ea0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3ec0: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
3ed0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
3ee0: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
3ef0: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b 0a  (VdbeFunc *)p4;.
3f00: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
3f10: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
3f20: 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75  , pVdbeFunc->pFu
3f30: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nc);.        sql
3f40: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
3f50: 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c  xData(pVdbeFunc,
3f60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
3f70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3f80: 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20  VdbeFunc);.     
3f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3fa0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3fb0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
3fc0: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
3fd0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75  Function(db, (Fu
3fe0: 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20  ncDef*)p4);.    
3ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4000: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4010: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  _MEM: {.        
4020: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
4030: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
4040: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4050: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4060: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
4070: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
4080: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
4090: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
40a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
40b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
40c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 3a 20 7b  4_SUBPROGRAM : {
40d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
40e0: 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c 65 74  VdbeProgramDelet
40f0: 65 28 64 62 2c 20 28 53 75 62 50 72 6f 67 72 61  e(db, (SubProgra
4100: 6d 20 2a 29 70 34 2c 20 31 29 3b 0a 20 20 20 20  m *)p4, 1);.    
4110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4120: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4130: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
4140: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
4150: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
4160: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
4170: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
4180: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
4190: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
41a0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
41b0: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
41c0: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
41d0: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
41e0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
41f0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4200: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4210: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4220: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4230: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
4240: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
4250: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
4260: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4270: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4280: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4290: 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74  EBUG.      sqlit
42a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
42b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
42c0: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
42d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
42e0: 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a  ee(db, aOp);.}..
42f0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
4300: 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 6f 6e  the ref-count on
4310: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
4320: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
4330: 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   as the.** secon
4340: 64 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74  d argument. If t
4350: 68 65 20 72 65 66 2d 63 6f 75 6e 74 20 72 65 61  he ref-count rea
4360: 63 68 65 73 20 7a 65 72 6f 2c 20 66 72 65 65 20  ches zero, free 
4370: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  the structure..*
4380: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 6f  *.** The array o
4390: 66 20 56 44 42 45 20 6f 70 63 6f 64 65 73 20 73  f VDBE opcodes s
43a0: 74 6f 72 65 64 20 61 73 20 53 75 62 50 72 6f 67  tored as SubProg
43b0: 72 61 6d 2e 61 4f 70 20 69 73 20 66 72 65 65 64  ram.aOp is freed
43c0: 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68   if.** either th
43d0: 65 20 72 65 66 2d 63 6f 75 6e 74 20 72 65 61 63  e ref-count reac
43e0: 68 65 73 20 7a 65 72 6f 20 6f 72 20 70 61 72 61  hes zero or para
43f0: 6d 65 74 65 72 20 66 72 65 65 6f 70 20 69 73 20  meter freeop is 
4400: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
4410: 53 69 6e 63 65 20 74 68 65 20 61 72 72 61 79 20  Since the array 
4420: 6f 66 20 6f 70 63 6f 64 65 73 20 70 6f 69 6e 74  of opcodes point
4430: 65 64 20 74 6f 20 62 79 20 53 75 62 50 72 6f 67  ed to by SubProg
4440: 72 61 6d 2e 61 4f 70 20 6d 61 79 20 64 69 72 65  ram.aOp may dire
4450: 63 74 6c 79 0a 2a 2a 20 6f 72 20 69 6e 64 69 72  ctly.** or indir
4460: 65 63 74 6c 79 20 63 6f 6e 74 61 69 6e 20 61 20  ectly contain a 
4470: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
4480: 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74 72 75   SubProgram stru
4490: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2a  cture itself..**
44a0: 20 42 79 20 70 61 73 73 69 6e 67 20 61 20 6e 6f   By passing a no
44b0: 6e 2d 7a 65 72 6f 20 66 72 65 65 6f 70 20 70 61  n-zero freeop pa
44c0: 72 61 6d 65 74 65 72 2c 20 74 68 65 20 63 61 6c  rameter, the cal
44d0: 6c 65 72 20 6d 61 79 20 65 6e 73 75 72 65 20 74  ler may ensure t
44e0: 68 61 74 20 61 6c 6c 0a 2a 2a 20 53 75 62 50 72  hat all.** SubPr
44f0: 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 73  ogram structures
4500: 20 61 6e 64 20 74 68 65 69 72 20 61 4f 70 20 61   and their aOp a
4510: 72 72 61 79 73 20 61 72 65 20 66 72 65 65 64 2c  rrays are freed,
4520: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
4530: 0a 2a 2a 20 61 72 65 20 73 75 63 68 20 63 69 72  .** are such cir
4540: 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 73  cular references
4550: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4560: 33 56 64 62 65 50 72 6f 67 72 61 6d 44 65 6c 65  3VdbeProgramDele
4570: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
4580: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 2c 20 69  SubProgram *p, i
4590: 6e 74 20 66 72 65 65 6f 70 29 7b 0a 20 20 69 66  nt freeop){.  if
45a0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
45b0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
45c0: 20 20 20 20 69 66 28 20 66 72 65 65 6f 70 20 7c      if( freeop |
45d0: 7c 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a  | p->nRef==1 ){.
45e0: 20 20 20 20 20 20 4f 70 20 2a 61 4f 70 20 3d 20        Op *aOp = 
45f0: 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 70 2d  p->aOp;.      p-
4600: 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  >aOp = 0;.      
4610: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
4620: 64 62 2c 20 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29  db, aOp, p->nOp)
4630: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 20 3d  ;.      p->nOp =
4640: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d   0;.    }.    p-
4650: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
4660: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
4670: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4680: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  ee(db, p);.    }
4690: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
46a0: 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73 20  hange N opcodes 
46b0: 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64 72  starting at addr
46c0: 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76   to No-ops..*/.v
46d0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
46e0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
46f0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
4700: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt N){.  if( p->
4710: 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  aOp ){.    VdbeO
4720: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
4730: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
4740: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
4750: 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  .    while( N-- 
4760: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
4770: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4780: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
4790: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
47a0: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
47b0: 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  );.      pOp->op
47c0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
47d0: 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20        pOp++;.   
47e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
47f0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4800: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
4810: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4820: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4830: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4840: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4850: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4860: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
4870: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
4880: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
4890: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
48a0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
48b0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
48c0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
48d0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
48e0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
48f0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
4900: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
4910: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
4920: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
4930: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4940: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4950: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
4960: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
4970: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
4980: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
4990: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
49a0: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
49b0: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
49c0: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
49d0: 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f zP4..**.** If 
49e0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74  n==P4_KEYINFO it
49f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20   means that zP4 
4a00: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4a10: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
4a20: 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69  ure..** A copy i
4a30: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65  s made of the Ke
4a40: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
4a50: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4a60: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
4a70: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20  ite3_malloc, to 
4a80: 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68  be freed when th
4a90: 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69  e Vdbe is finali
4aa0: 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45  zed..** n==P4_KE
4ab0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e  YINFO_HANDOFF in
4ac0: 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34  dicates that zP4
4ad0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
4ae0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
4af0: 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  * stored in memo
4b00: 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ry that the call
4b10: 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  er has obtained 
4b20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
4b30: 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c  loc. The .** cal
4b40: 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66  ler should not f
4b50: 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ree the allocati
4b60: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66  on, it will be f
4b70: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
4b80: 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a  be is.** finaliz
4b90: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  ed..** .** Other
4ba0: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
4bb0: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
4bc0: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
4bd0: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
4be0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
4bf0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
4c00: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
4c10: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
4c20: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
4c30: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
4c40: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
4c50: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
4c60: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
4c70: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
4c80: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
4c90: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
4ca0: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
4cb0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4cc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
4cd0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
4ce0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
4cf0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
4d00: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
4d10: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
4d20: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
4d30: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4d40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4d50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4d60: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
4d70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4d80: 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50  ){.    if ( n!=P
4d90: 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d  4_KEYINFO && n!=
4da0: 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20  P4_VTAB ) {.    
4db0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20    freeP4(db, n, 
4dc0: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
4dd0: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
4de0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
4df0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
4e10: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
4e20: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
4e30: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
4e40: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
4e50: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4e60: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
4e70: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
4e80: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
4e90: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
4ea0: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
4eb0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
4ec0: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
4ed0: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
4ee0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
4ef0: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
4f00: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
4f10: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
4f20: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
4f30: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
4f40: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
4f50: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
4f60: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
4f70: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
4f80: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
4f90: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
4fa0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
4fb0: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
4fc0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
4fd0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
4fe0: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
4ff0: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
5000: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
5010: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
5020: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
5030: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
5040: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
5050: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
5060: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
5070: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
5080: 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  te3Malloc( nByte
5090: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
50a0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
50b0: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
50c0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
50d0: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
50e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
50f0: 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65  Info, zP4, nByte
5100: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
5110: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
5120: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
5130: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
5140: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
5150: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5160: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
5170: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
5180: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
5190: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
51a0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
51b0: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
51c0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
51d0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
51e0: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
51f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5200: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5210: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
5220: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5230: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
5240: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5250: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
5260: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5270: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5280: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5290: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
52a0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
52b0: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d  VTAB ){.    pOp-
52c0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
52d0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
52e0: 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20  ype = P4_VTAB;. 
52f0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f     sqlite3VtabLo
5300: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ck((VTable *)zP4
5310: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5320: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e  (VTable *)zP4)->
5330: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
5340: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
5350: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5360: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5370: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
5380: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
5390: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
53a0: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
53b0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
53c0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
53d0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
53e0: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
53f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5400: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
5410: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
5420: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  EBUG./*.** Chang
5430: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
5440: 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65   the the most re
5450: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
5460: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
5470: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
5480: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
5490: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
54a0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
54b0: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
54c0: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
54d0: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
54e0: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
54f0: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
5500: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
5510: 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  uild..*/.void sq
5520: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
5530: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5540: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5550: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5560: 70 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  p;.  if( !p ) re
5570: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
5580: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
5590: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
55a0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
55b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
55c0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
55d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
55e0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
55f0: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
5600: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
5610: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
5620: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
5630: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5640: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5650: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
5660: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
5670: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
5680: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
5690: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
56a0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
56b0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
56c0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
56d0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
56e0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
56f0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
5700: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
5710: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
5720: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
5730: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
5740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5750: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
5760: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
5770: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
5780: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5790: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
57a0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
57b0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
57c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
57d0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
57e0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
57f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
5800: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
5810: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
5820: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5830: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5840: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5850: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
5860: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
5870: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
5880: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
5890: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
58a0: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
58b0: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
58c0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
58d0: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
58e0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
58f0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
5900: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
5910: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
5920: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
5930: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
5940: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
5950: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
5960: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
5970: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
5980: 62 6c 65 20 61 6e 64 20 77 72 69 74 61 62 6c 65  ble and writable
5990: 2c 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 20  , but it has no 
59a0: 65 66 66 65 63 74 2e 20 20 54 68 65 20 72 65 74  effect.  The ret
59b0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 0a 2a  urn of a dummy.*
59c0: 2a 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  * opcode allows 
59d0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
59e0: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
59f0: 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75   after a OOM fau
5a00: 6c 74 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  lt without.** ha
5a10: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
5a20: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
5a30: 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75  rn from this rou
5a40: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
5a50: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  pointer..**.** A
5a60: 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20  bout the #ifdef 
5a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
5a80: 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  E:  Normally, th
5a90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
5aa0: 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e  ver called.** un
5ab0: 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20  less p->nOp>0.  
5ac0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
5ad0: 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f  in the absense o
5ae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5af0: 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72  ACE,.** an OP_Tr
5b00: 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ace instruction 
5b10: 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74  is always insert
5b20: 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
5b30: 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61  eGet() as soon a
5b40: 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20  s.** a new VDBE 
5b50: 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20  is created.  So 
5b60: 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73  we are free to s
5b70: 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f  et addr to p->nO
5b80: 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  p-1 without.** h
5b90: 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d  aving to double-
5ba0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
5bb0: 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75  re that the resu
5bc0: 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  lt is non-negati
5bd0: 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51  ve. But.** if SQ
5be0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
5bf0: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  is defined, the 
5c00: 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74  OP_Trace is omit
5c10: 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65  ted and we do ne
5c20: 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74  ed to.** check t
5c30: 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e  he value of p->n
5c40: 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74  Op-1 before cont
5c50: 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f  inuing..*/.VdbeO
5c60: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
5c70: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
5c80: 20 61 64 64 72 29 7b 0a 20 20 73 74 61 74 69 63   addr){.  static
5c90: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 0a 20   VdbeOp dummy;. 
5ca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5cb0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5cc0: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
5cd0: 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  <0 ){.#ifdef SQL
5ce0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
5cf0: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30     if( p->nOp==0
5d00: 20 29 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79   ) return &dummy
5d10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64  ;.#endif.    add
5d20: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5d30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61    }.  assert( (a
5d40: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
5d50: 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d  ->nOp) || p->db-
5d60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
5d70: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
5d80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
5d90: 20 20 72 65 74 75 72 6e 20 26 64 75 6d 6d 79 3b    return &dummy;
5da0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
5db0: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
5dc0: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  r];.  }.}..#if !
5dd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5de0: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20  MIT_EXPLAIN) || 
5df0: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
5e00: 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e   \.     || defin
5e10: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
5e20: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
5e30: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
5e40: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
5e50: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
5e60: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
5e70: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
5e80: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
5e90: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
5ea0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
5eb0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
5ec0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
5ed0: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
5ee0: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
5ef0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
5f00: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
5f10: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
5f20: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
5f30: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
5f40: 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49  P4_KEYINFO_STATI
5f50: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  C:.    case P4_K
5f60: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5f70: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
5f80: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
5f90: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
5fa0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  Info;.      sqli
5fb0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
5fc0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
5fd0: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
5fe0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
5ff0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
6000: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
6010: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6020: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
6030: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
6040: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6050: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
6060: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
6070: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
6080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
6090: 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c  e3Strlen30(pColl
60a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
60b0: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
60c0: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
60d0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
60e0: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
60f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
6100: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6110: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
6120: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
6130: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
6140: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
6150: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
6160: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
6170: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
6180: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
6190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
61a0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
61b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b   pColl->zName,n+
61c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
61d0: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
61e0: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
61f0: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
6200: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
6210: 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20  ],",nil",4);.   
6220: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
6230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6240: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
6250: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
6260: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
6270: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
6280: 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  mp );.      brea
6290: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
62a0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
62b0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
62c0: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
62d0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
62e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
62f0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c  mp, zTemp, "coll
6300: 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  seq(%.20s)", pCo
6310: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
6320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6330: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
6340: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
6350: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
6360: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
6370: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6380: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6390: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
63a0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
63b0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
63c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
63d0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
63e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
63f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6400: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
6410: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
6420: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6430: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
6440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6450: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6460: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
6470: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
6480: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6490: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
64a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
64b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
64c0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
64d0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
64e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
64f0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
6500: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
6510: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
6520: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
6530: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
6540: 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b   MEM_Null)==0 );
6550: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
6560: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
6570: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
6580: 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20  = pMem->z;.     
6590: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
65a0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
65b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
65c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
65d0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
65e0: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
65f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
6600: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6610: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
6620: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6630: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6640: 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72  "%.16g", pMem->r
6650: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6660: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6670: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6680: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
6690: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
66a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
66b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
66c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
66e0: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
66f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6700: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
6710: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
6720: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
6730: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6740: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
6750: 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56  p:%p", pVtab, pV
6760: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20  tab->pModule);. 
6770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6780: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
6790: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
67a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
67b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
67c0: 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22  Temp, "intarray"
67d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
67e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
67f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6810: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6820: 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  emp, "program");
6830: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6840: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
6850: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
6860: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
6870: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
6880: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
6890: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
68a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
68b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
68c0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
68d0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
68e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  endif../*.** Dec
68f0: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
6900: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
6910: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
6920: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2f  b[i] is used..*/
6930: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6940: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6950: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
6960: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
6970: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
6980: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69 7a 65  b->nDb && i<size
6990: 6f 66 28 75 33 32 29 2a 38 20 29 3b 0a 20 20 61  of(u32)*8 );.  a
69a0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
69b0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
69c0: 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d  k)*8 );.  mask =
69d0: 20 28 28 75 33 32 29 31 29 3c 3c 69 3b 0a 20 20   ((u32)1)<<i;.  
69e0: 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  if( (p->btreeMas
69f0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
6a00: 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b      p->btreeMask
6a10: 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73 71   |= mask;.    sq
6a20: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
6a30: 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e 61  rrayInsert(&p->a
6a40: 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61 44  Mutex, p->db->aD
6a50: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a 7d  b[i].pBt);.  }.}
6a60: 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  ...#if defined(V
6a70: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6a90: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
6aa0: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
6ab0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6ac0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
6ad0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
6ae0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6af0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
6b00: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
6b10: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
6b20: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
6b30: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
6b40: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6b50: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
6b60: 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73 20  4d %4d %4d %-4s 
6b70: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
6b80: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
6b90: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
6ba0: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
6bb0: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
6bc0: 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74 66  Ptr));.  fprintf
6bd0: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
6be0: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
6bf0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
6c00: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
6c10: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
6c20: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
6c30: 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  >p5,.#ifdef SQLI
6c40: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70  TE_DEBUG.      p
6c50: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20 70  Op->zComment ? p
6c60: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20 22  Op->zComment : "
6c70: 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 22  ".#else.      ""
6c80: 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66  .#endif.  );.  f
6c90: 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23  flush(pOut);.}.#
6ca0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
6cb0: 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66  ease an array of
6cc0: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a   N Mem elements.
6cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
6ce0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d  eleaseMemArray(M
6cf0: 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  em *p, int N){. 
6d00: 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20   if( p && N ){. 
6d10: 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20     Mem *pEnd;.  
6d20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6d30: 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61  p->db;.    u8 ma
6d40: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62  lloc_failed = db
6d50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
6d60: 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b      for(pEnd=&p[
6d70: 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29  N]; p<pEnd; p++)
6d80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6d90: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
6da0: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
6db0: 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  b );..      /* T
6dc0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
6dd0: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
6de0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
6df0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
6e00: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
6e10: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
6e20: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
6e30: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
6e40: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
6e50: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
6e60: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
6e70: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
6e80: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
6e90: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
6ea0: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
6eb0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
6ec0: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
6ed0: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
6ee0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
6ef0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
6f00: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
6f10: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
6f20: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
6f30: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
6f40: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
6f50: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
6f60: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
6f70: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
6f80: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
6f90: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
6fa0: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
6fb0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
6fc0: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
6fd0: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
6fe0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
6ff0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
7000: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
7010: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
7020: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
7030: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
7040: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
7050: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
7060: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
7070: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
7080: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
7090: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
70a0: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
70b0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
70c0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
70d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
70e0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
70f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
7100: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
7110: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7120: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7130: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61  ;.        p->zMa
7140: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
7150: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
7160: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7170: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
7180: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
7190: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
71a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
71b0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
71c0: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
71d0: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
71e0: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
71f0: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
7200: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
7210: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
7220: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
7230: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
7240: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
7250: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
7260: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
7270: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
7280: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
7290: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
72a0: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
72b0: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
72c0: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
72d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
72e0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
72f0: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
7300: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
7310: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
7320: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
7330: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
7340: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
7350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7360: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
7370: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
7380: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
7390: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
73a0: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
73b0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
73c0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
73d0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
73e0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
73f0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
7400: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
7410: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
7420: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
7430: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
7440: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
7450: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
7460: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
7470: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
7480: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
7490: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
74a0: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
74b0: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
74c0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
74d0: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
74e0: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
74f0: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
7500: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
7510: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
7520: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
7530: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
7540: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
7550: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
7560: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
7570: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
7580: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
7590: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
75a0: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
75b0: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
75c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
75d0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
7600: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
7630: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
7640: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
7650: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
7660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7680: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
7690: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
76a0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
76b0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
76c0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
76d0: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
76e0: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
7710: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
7720: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
7730: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
7740: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
7750: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
7760: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7770: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
77a0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
77b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
77c0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
77d0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
77e0: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
77f0: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
7800: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
7810: 3b 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20  ;  /* First Mem 
7820: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
7830: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
7840: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
7850: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
7860: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
7870: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
7880: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
7890: 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  C_BUSY );.  asse
78a0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
78b0: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
78c0: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d  QLITE_BUSY || p-
78d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  >rc==SQLITE_NOME
78e0: 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  M );..  /* Even 
78f0: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f  though this opco
7900: 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  de does not use 
7910: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20  dynamic strings 
7920: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73  for.  ** the res
7930: 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75  ult, result colu
7940: 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64  mns may become d
7950: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73  ynamic if the us
7960: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71  er calls.  ** sq
7970: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7980: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61  t16(), causing a
7990: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20   translation to 
79a0: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e  UTF-16 encoding.
79b0: 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d  .  */.  releaseM
79c0: 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29  emArray(pMem, 8)
79d0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
79e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
79f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
7a00: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
7a10: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
7a20: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
7a30: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
7a40: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
7a50: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
7a60: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
7a70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
7a80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7a90: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
7aa0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
7ab0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
7ac0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
7ad0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
7ae0: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
7af0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
7b00: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
7b10: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
7b20: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
7b30: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
7b40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
7b50: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
7b60: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
7b70: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
7b80: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
7b90: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
7ba0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
7bb0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
7bc0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
7bd0: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
7be0: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
7bf0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
7c00: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
7c10: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
7c20: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
7c30: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
7c40: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
7c50: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
7c60: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
7c70: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
7c80: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
7c90: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
7ca0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
7cb0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
7cc0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
7cd0: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
7ce0: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
7cf0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
7d00: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
7d10: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
7d20: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
7d30: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
7d40: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
7d50: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
7d60: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
7d70: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
7d80: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
7d90: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
7da0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
7db0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
7dc0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
7dd0: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
7de0: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
7df0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
7e00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
7e10: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
7e20: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
7e30: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
7e40: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
7e50: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
7e60: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
7e70: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
7e80: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
7e90: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
7ea0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
7eb0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
7ec0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
7ed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
7ee0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
7ef0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
7f00: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
7f10: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
7f20: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
7f30: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
7f40: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
7f50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
7f60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
7f70: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
7f80: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
7f90: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
7fa0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
7fb0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
7fc0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
7fd0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7fe0: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
7ff0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
8000: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
8010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
8020: 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70   *z;.    Op *pOp
8030: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
8040: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
8050: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
8060: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
8070: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
8080: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
8090: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
80a0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
80b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
80c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
80d0: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
80e0: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
80f0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
8100: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
8110: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
8120: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
8130: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
8140: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
8150: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
8160: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8170: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
8180: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8190: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
81a0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
81b0: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
81c0: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
81d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
81e0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
81f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8200: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
8210: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8220: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8230: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8260: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
8270: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
8280: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
8290: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
82a0: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
82b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
82c0: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
82d0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
82e0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
82f0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
8300: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
8310: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
8320: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
8330: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
8340: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
8350: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
8360: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
8370: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
8380: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
8390: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
83a0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
83b0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
83c0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
83d0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
83e0: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
83f0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
8400: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
8410: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
8420: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
8430: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
8440: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
8450: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
8460: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
8470: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
8480: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
8490: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
84a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
84b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
84c0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
84d0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
84e0: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
84f0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
8500: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
8510: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
8520: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
8530: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
8540: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
8550: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
8560: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8570: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
8580: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
8590: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
85a0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20  pSub, nByte, 1) 
85b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
85c0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
85d0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
85e0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
85f0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
8600: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
8610: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
8620: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
8630: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
8640: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
8650: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
8660: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8670: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
8680: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8690: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
86a0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
86d0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
86e0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
86f0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
8700: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
8710: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
8720: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
8750: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
8760: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
8770: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
8780: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
8790: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
87a0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
87b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
87c0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
87f0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8800: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8810: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
8820: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
8830: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
8840: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
8850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8860: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
8870: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
8880: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
88a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
88b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
88c0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
88d0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
88e0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
88f0: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
8900: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
8910: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8920: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
8930: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
8940: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
8950: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8960: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
8970: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
8980: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8990: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
89a0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
89b0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
89c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
89d0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
89e0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
89f0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
8a00: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
8a10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
8a20: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
8a30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8a40: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
8a50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
8a60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8a70: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
8a80: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8a90: 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72   MEM_Dyn|MEM_Str
8aa0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
8ab0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
8ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8ad0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
8ae0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
8af0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
8b00: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8b10: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20   SQLITE_TEXT;.  
8b20: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
8b30: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
8b40: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
8b50: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8b60: 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  G.      if( pOp-
8b70: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8b80: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
8b90: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
8ba0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  erm;.        pMe
8bb0: 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d  m->z = pOp->zCom
8bc0: 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d  ment;.        pM
8bd0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
8be0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
8bf0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
8c00: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
8c10: 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  8;.        pMem-
8c20: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
8c30: 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EXT;.      }else
8c40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
8c50: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
8c60: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20  ags = MEM_Null; 
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74        /* Comment
8c90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   */.        pMem
8ca0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8cb0: 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
8cc0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
8cd0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28  Column = 8 - 5*(
8ce0: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
8cf0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
8d00: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
8d10: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
8d20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
8d30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8d40: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
8d50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8d60: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
8d70: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
8d80: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
8d90: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
8da0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8db0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
8dc0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
8dd0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
8de0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
8df0: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
8e00: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
8e10: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
8e20: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
8e30: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
8e40: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
8e50: 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
8e60: 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  z;.    while( sq
8e70: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
8e80: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
8e90: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
8ea0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
8eb0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
8ec0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
8ed0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
8ee0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
8ef0: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
8f00: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
8f10: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
8f20: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
8f30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
8f40: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
8f50: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
8f60: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
8f70: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
8f80: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
8f90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
8fa0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
8fb0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
8fc0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
8fd0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
8fe0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
8ff0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
9000: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
9010: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9020: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
9030: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
9040: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
9050: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
9060: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
9070: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
9080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9090: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
90a0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
90b0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
90c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
90d0: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
90e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
90f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
9100: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
9110: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
9120: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
9130: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
9140: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
9150: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
9160: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
9170: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
9180: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
9190: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
91a0: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
91b0: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
91c0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
91d0: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
91e0: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
91f0: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
9200: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
9210: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
9220: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9230: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
9240: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
9250: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
9260: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
9270: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
9280: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
9290: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
92a0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
92b0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
92c0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
92d0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
92e0: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
92f0: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
9300: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
9310: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
9320: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
9330: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
9340: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
9350: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
9360: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
9370: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
9380: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
9390: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
93a0: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
93b0: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
93c0: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
93d0: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
93e0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
93f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
9400: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
9410: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
9420: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
9430: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
9440: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
9450: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
9460: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
9470: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
9480: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9490: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
94a0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
94b0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
94c0: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
94d0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
94e0: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
94f0: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
9500: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
9510: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
9520: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
9530: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
9540: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
9550: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
9560: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
9570: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
9580: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
9590: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
95a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
95b0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
95c0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
95d0: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
95e0: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
95f0: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
9600: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
9610: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
9620: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
9630: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
9640: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
9650: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
9660: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
9670: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
9680: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
9690: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
96a0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
96b0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
96c0: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
96d0: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
96e0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
96f0: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
9700: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
9710: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
9720: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
9730: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
9740: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
9750: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
9760: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
9770: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
9780: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
9790: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
97a0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
97b0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
97c0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
97d0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
97e0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
97f0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
9800: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
9810: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
9820: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
9830: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
9840: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
9850: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
9860: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
9870: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
9880: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
9890: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
98a0: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
98b0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
98c0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
98d0: 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _RUN..**.** This
98e0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
98f0: 20 63 61 6c 6c 65 64 20 6d 6f 72 65 20 74 68 61   called more tha
9900: 6e 20 6f 6e 63 65 20 6f 6e 20 61 20 73 69 6e 67  n once on a sing
9910: 6c 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  le virtual machi
9920: 6e 65 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ne..** The first
9930: 20 63 61 6c 6c 20 69 73 20 6d 61 64 65 20 77 68   call is made wh
9940: 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  ile compiling th
9950: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
9960: 20 53 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63   Subsequent.** c
9970: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 20 61 73  alls are made as
9980: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f   part of the pro
9990: 63 65 73 73 20 6f 66 20 72 65 73 65 74 74 69 6e  cess of resettin
99a0: 67 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  g a statement to
99b0: 20 62 65 0a 2a 2a 20 72 65 2d 65 78 65 63 75 74   be.** re-execut
99c0: 65 64 20 28 66 72 6f 6d 20 61 20 63 61 6c 6c 20  ed (from a call 
99d0: 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  to sqlite3_reset
99e0: 28 29 29 2e 20 54 68 65 20 6e 56 61 72 2c 20 6e  ()). The nVar, n
99f0: 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 0a 2a 2a  Mem, nCursor .**
9a00: 20 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 70   and isExplain p
9a10: 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6f 6e  arameters are on
9a20: 6c 79 20 70 61 73 73 65 64 20 63 6f 72 72 65 63  ly passed correc
9a30: 74 20 76 61 6c 75 65 73 20 74 68 65 20 66 69 72  t values the fir
9a40: 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 65 20 66  st time.** the f
9a50: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
9a60: 64 2e 20 4f 6e 20 73 75 62 73 65 71 75 65 6e 74  d. On subsequent
9a70: 20 63 61 6c 6c 73 2c 20 66 72 6f 6d 20 73 71 6c   calls, from sql
9a80: 69 74 65 33 5f 72 65 73 65 74 28 29 2c 20 6e 56  ite3_reset(), nV
9a90: 61 72 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  ar.** is passed 
9aa0: 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c 20 6e 43 75  -1 and nMem, nCu
9ab0: 72 73 6f 72 20 61 6e 64 20 69 73 45 78 70 6c 61  rsor and isExpla
9ac0: 69 6e 20 61 72 65 20 61 6c 6c 20 70 61 73 73 65  in are all passe
9ad0: 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  d zero..*/.void 
9ae0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
9af0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
9b20: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
9b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9b40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9b50: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
9b60: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
9b70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9ba0: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
9bb0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
9bc0: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9be0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
9bf0: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
9c00: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
9c30: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 69 6e  umber of args in
9c40: 20 53 75 62 50 72 6f 67 72 61 6d 73 20 2a 2f 0a   SubPrograms */.
9c50: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 2c    int isExplain,
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
9c80: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
9c90: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
9ca0: 20 69 6e 74 20 75 73 65 73 53 74 6d 74 4a 6f 75   int usesStmtJou
9cb0: 72 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 20  rnal            
9cc0: 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 56  /* True to set V
9cd0: 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75 72  dbe.usesStmtJour
9ce0: 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nal */.){.  int 
9cf0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
9d00: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73   = p->db;..  ass
9d10: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
9d20: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9d30: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
9d40: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
9d50: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
9d60: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
9d70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9d80: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
9d90: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
9da0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
9db0: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
9dc0: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
9dd0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
9de0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f 2a 20  AGIC_RUN;..  /* 
9df0: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
9e00: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
9e10: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
9e20: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
9e30: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
9e40: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
9e50: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
9e60: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
9e70: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
9e80: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
9e90: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
9ea0: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
9eb0: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
9ec0: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
9ed0: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
9ee0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
9ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
9f00: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
9f10: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
9f20: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
9f30: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
9f40: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
9f50: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
9f60: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
9f70: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
9f80: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
9f90: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
9fa0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
9fb0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
9fc0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
9fd0: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
9fe0: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
9ff0: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
a000: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
a010: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
a020: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
a030: 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54 68 69 73  guments in. This
a040: 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 74 68   is only done th
a050: 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 69 6d  e.  ** first tim
a060: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
a070: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  is called for a 
a080: 67 69 76 65 6e 20 56 44 42 45 2c 20 6e 6f 74 20  given VDBE, not 
a090: 77 68 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20  when it is.  ** 
a0a0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
a0b0: 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  m sqlite3_reset(
a0c0: 29 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 76  ) to reset the v
a0d0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
a0e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 61 72 3e    */.  if( nVar>
a0f0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 64 62 2d  =0 && ALWAYS(db-
a100: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
a110: 29 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 73  ) ){.    u8 *zCs
a120: 72 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f  r = (u8 *)&p->aO
a130: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
a140: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69   /* Memory avali
a150: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 61 74 69  able for alloati
a160: 6f 6e 20 2a 2f 0a 20 20 20 20 75 38 20 2a 7a 45  on */.    u8 *zE
a170: 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61  nd = (u8 *)&p->a
a180: 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  Op[p->nOpAlloc];
a190: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
a1a0: 70 61 73 74 20 61 76 61 69 6c 61 62 6c 65 20 6d  past available m
a1b0: 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  em */.    int nB
a1c0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
a1f0: 74 72 61 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65  tra memory neede
a200: 64 20 2a 2f 0a 0a 20 20 20 20 72 65 73 6f 6c 76  d */..    resolv
a210: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
a220: 72 67 29 3b 0a 20 20 20 20 70 2d 3e 75 73 65 73  rg);.    p->uses
a230: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
a240: 38 29 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  8)usesStmtJourna
a250: 6c 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  l;.    if( isExp
a260: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
a270: 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20  ){.      nMem = 
a280: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  10;.    }.    me
a290: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
a2a0: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20 7a 43  nd-zCsr);.    zC
a2b0: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
a2c0: 38 2a 29 30 29 26 37 3b 0a 20 20 20 20 61 73 73  8*)0)&7;.    ass
a2d0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
a2e0: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
a2f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  );..    /* Memor
a300: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
a310: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
a320: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
a330: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
a340: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
a350: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
a360: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
a370: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
a380: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 65 6e 64   the .    ** end
a390: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
a3a0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
a3b0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
a3c0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
a3d0: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
a3e0: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
a3f0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
a400: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
a410: 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 61 73 73 20  ond.    ** pass 
a420: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
a430: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
a440: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
a450: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
a460: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
a470: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
a480: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
a490: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
a4a0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  om.    ** the le
a4b0: 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20  ftover space at 
a4c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
a4d0: 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20  pcode array can 
a4e0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
a4f0: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
a500: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
a510: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
a520: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
a530: 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
a540: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a       nByte = 0;.
a550: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20        p->aMem = 
a560: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
a570: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
a580: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
a590: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a5a0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
a5b0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
a5c0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
a5d0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
a5e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d  nByte);.      p-
a5f0: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
a600: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
a610: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
a620: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a630: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a640: 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  azVar = allocSpa
a650: 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  ce(p->azVar, nVa
a660: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
a670: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a680: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a690: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
a6a0: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
a6b0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
a6c0: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
a6f0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
a700: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
a710: 20 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20         p->pFree 
a720: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
a730: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
a740: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a750: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
a760: 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  .      zEnd = &z
a770: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20  Csr[nByte];.    
a780: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
a790: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
a7a0: 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43  ed );..    p->nC
a7b0: 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75  ursor = (u16)nCu
a7c0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
a7d0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  >aVar ){.      p
a7e0: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
a7f0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  nVar;.      for(
a800: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
a810: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  ){.        p->aV
a820: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
a830: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
a840: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
a850: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
a860: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65  }.    if( p->aMe
a870: 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  m ){.      p->aM
a880: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
a890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
a8a0: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
a8b0: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  ..nMem */.      
a8c0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
a8f0: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
a900: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
a910: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
a920: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
a930: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
a940: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
a950: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
a960: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a980: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
a990: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
a9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
a9b0: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
a9c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
a9d0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
a9e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a9f0: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
aa00: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
aa10: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
aa20: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
aa30: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
aa40: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
aa50: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
aa60: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
aa70: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
aa80: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53  t = 255;.  p->iS
aa90: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69  tatement = 0;.#i
aaa0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
aab0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b  E.  {.    int i;
aac0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
aad0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
aae0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
aaf0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
ab00: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
ab10: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  0;.    }.  }.#en
ab20: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
ab30: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
ab40: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
ab50: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
ab60: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
ab70: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
ab80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ab90: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
aba0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
abb0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
abc0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
abd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
abe0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
abf0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ac00: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
ac10: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
ac20: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
ac30: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ac40: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ac50: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
ac60: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
ac70: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
ac80: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
ac90: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
aca0: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
acb0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
acc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
acd0: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
ace0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
acf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
ad00: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
ad10: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
ad20: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
ad30: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
ad40: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
ad50: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  Cx->pModule;.   
ad60: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
ad70: 20 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 1;.    (void)
ad80: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
ad90: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f  (p->db);.    pMo
ada0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
adb0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28  abCursor);.    (
adc0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
add0: 74 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20  tyOn(p->db);.   
ade0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
adf0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
ae00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
ae10: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
ae20: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
ae30: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
ae40: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
ae50: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
ae60: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
ae70: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
ae80: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
ae90: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
aea0: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
aeb0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
aec0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
aed0: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
aee0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
aef0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
af00: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
af10: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
af20: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
af30: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
af40: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
af50: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
af60: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
af70: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
af80: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
af90: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
afa0: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
afb0: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
afc0: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
afd0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
afe0: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  nChange;.  retur
aff0: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
b000: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
b010: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
b020: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
b030: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
b040: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
b050: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
b060: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
b070: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
b080: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
b090: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
b0a0: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
b0b0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
b0c0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
b0d0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
b0e0: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
b0f0: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
b100: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
b110: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
b120: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
b130: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
b140: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
b150: 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46   *pFrame = p->pF
b160: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
b170: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
b180: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
b190: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
b1a0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
b1b0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
b1c0: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
b1d0: 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d   }.  p->pFrame =
b1e0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20   0;.  p->nFrame 
b1f0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  = 0;..  if( p->a
b200: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
b210: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
b220: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
b230: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
b240: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
b250: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
b260: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
b270: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
b280: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
b290: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
b2a0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
b2b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
b2c0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
b2d0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
b2e0: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
b2f0: 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  em);.  }.}../*.*
b300: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
b310: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
b320: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
b330: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
b340: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
b350: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
b360: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
b370: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
b380: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
b390: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
b3a0: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
b3b0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
b3c0: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
b3d0: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
b3e0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
b3f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
b400: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
b410: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
b420: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
b430: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
b440: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
b450: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
b460: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
b470: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
b480: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
b490: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
b4a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b4b0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
b4c0: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d  ssert( p->apCsr=
b4d0: 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69  =0 || p->apCsr[i
b4e0: 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  ]==0 );.  for(i=
b4f0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
b500: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
b510: 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65  Mem==0 || p->aMe
b520: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
b530: 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  Null );.#endif..
b540: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b550: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
b560: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
b570: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
b580: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
b590: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
b5a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
b5b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
b5c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b5d0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
b5e0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
b5f0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
b600: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
b610: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
b620: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
b630: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
b640: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
b650: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
b660: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
b670: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
b680: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
b690: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b6a0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
b6b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
b6c0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
b6d0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
b6e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
b6f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65  b = p->db;..  re
b700: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
b710: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
b720: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
b730: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  _N);.  sqlite3Db
b740: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
b750: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
b760: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
b770: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
b780: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
b790: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
b7a0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
b7b0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
b7c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
b7d0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
b7e0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
b7f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
b800: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
b810: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
b820: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
b830: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
b840: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
b850: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
b860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
b870: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
b880: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
b890: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
b8a0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
b8b0: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
b8c0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
b8d0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
b8e0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
b8f0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
b900: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
b910: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
b920: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
b930: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
b940: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
b950: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
b960: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
b970: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
b980: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
b990: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
b9a0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
b9b0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
b9c0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
b9d0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
b9e0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
b9f0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
ba00: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
ba10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
ba20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
ba30: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
ba60: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
ba70: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
baa0: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
bab0: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
bac0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
bad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
bae0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
baf0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
bb00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
bb10: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
bb20: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
bb30: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
bb40: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
bb50: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb70: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
bb80: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
bb90: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
bba0: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
bbb0: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
bbc0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
bbd0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
bbe0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
bbf0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
bc00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
bc10: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
bc20: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
bc30: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
bc40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bc50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
bc60: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
bc70: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
bc80: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
bc90: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
bca0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
bcb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
bcc0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
bcd0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
bce0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
bcf0: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
bd00: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
bd10: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
bd20: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
bd30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bd40: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
bd50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
bd60: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
bd70: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
bd80: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
bd90: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
bda0: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
bdb0: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
bdc0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
bdd0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
bde0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
bdf0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
be00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
be10: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
be20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
be30: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
be40: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
be50: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
be60: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
be70: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
be80: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
be90: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
bea0: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
beb0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
bec0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
bed0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
bee0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
bef0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
bf00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bf10: 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
bf20: 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
bf30: 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
bf40: 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
bf50: 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
bf60: 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
bf70: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
bf80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
bf90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
bfa0: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
bfb0: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
bfc0: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
bfd0: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
bfe0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
bff0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
c000: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
c010: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
c020: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
c030: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
c040: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
c050: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c060: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
c070: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
c080: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
c090: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
c0a0: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
c0b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
c0c0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
c0d0: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70  3VtabSync(db, &p
c0e0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  ->zErrMsg);.  if
c0f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c100: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
c110: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
c120: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
c130: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
c140: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
c150: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
c160: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
c170: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
c180: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
c190: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
c1a0: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
c1b0: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
c1c0: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
c1d0: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
c1e0: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
c1f0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
c200: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
c210: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
c220: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c230: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
c240: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
c250: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
c260: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  */ .  for(i=0; i
c270: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
c280: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
c290: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
c2a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
c2b0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
c2c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
c2d0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
c2e0: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
c2f0: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a  nTrans++;.    }.
c300: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
c310: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
c320: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
c330: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
c340: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
c350: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
c360: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
c370: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
c380: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
c390: 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20  etyOff(db);.    
c3a0: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
c3b0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
c3c0: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76  mmitArg);.    (v
c3d0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
c3e0: 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28  yOn(db);.    if(
c3f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
c400: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
c410: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  RAINT;.    }.  }
c420: 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c  ..  /* The simpl
c430: 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65  e case - no more
c440: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
c450: 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75  se file (not cou
c460: 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54  nting the.  ** T
c470: 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61  EMP database) ha
c480: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
c490: 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20  active.   There 
c4a0: 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74  is no need for t
c4b0: 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  he.  ** master-j
c4c0: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ournal..  **.  *
c4d0: 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20  * If the return 
c4e0: 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33  value of sqlite3
c4f0: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
c500: 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e  () is a zero len
c510: 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c  gth.  ** string,
c520: 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61   it means the ma
c530: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a  in database is :
c540: 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d  memory: or a tem
c550: 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a  p file.  In .  *
c560: 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64  * that case we d
c570: 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74  o not support at
c580: 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20  omic multi-file 
c590: 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20  commits, so use 
c5a0: 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65  the .  ** simple
c5b0: 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a   case then too..
c5c0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71    */.  if( 0==sq
c5d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71  lite3Strlen30(sq
c5e0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
c5f0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
c600: 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72  .pBt)).   || nTr
c610: 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20  ans<=1.  ){.    
c620: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
c630: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
c640: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
c650: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
c660: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
c670: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
c680: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c690: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
c6a0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
c6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c6c0: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
c6d0: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
c6e0: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
c6f0: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
c700: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
c710: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
c720: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
c730: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
c740: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
c750: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
c760: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
c770: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
c780: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
c790: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
c7a0: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
c7b0: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
c7c0: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
c7d0: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
c7e0: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
c7f0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c800: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
c810: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
c820: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
c830: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
c840: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
c850: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
c860: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c870: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
c880: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
c890: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
c8a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c8b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
c8c0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
c8d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
c8e0: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
c8f0: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
c900: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
c910: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
c920: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
c930: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c940: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
c950: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
c960: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
c970: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
c980: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c990: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
c9a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
c9b0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
c9c0: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
c9d0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
c9e0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
c9f0: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
ca00: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
ca10: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
ca20: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
ca30: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
ca40: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
ca50: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
ca60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ca70: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
ca80: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
ca90: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
caa0: 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  s;..    /* Selec
cab0: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
cac0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
cad0: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
cae0: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
caf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
cb00: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
cb10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
cb20: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
cb30: 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
cb40: 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72  );.      zMaster
cb50: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
cb60: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58  f(db, "%s-mj%08X
cb70: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52  ", zMainFile, iR
cb80: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
cb90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
cba0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
cbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cbc0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
cbd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cbe0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
cbf0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
cc00: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
cc10: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
cc20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
cc30: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
cc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cc50: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
cc60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cc70: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
cc80: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
cc90: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
cca0: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
ccb0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ccc0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
ccd0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
cce0: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
ccf0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
cd00: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
cd10: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
cd20: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
cd30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cd40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
cd50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
cd60: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
cd70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
cd80: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
cd90: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
cda0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
cdb0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
cdc0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
cdd0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
cde0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
cdf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
ce00: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
ce10: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
ce20: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ce30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
ce40: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
ce50: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
ce60: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
ce70: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
ce80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
ce90: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
cea0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
ceb0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
cec0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
ced0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
cee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
cef0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
cf00: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
cf10: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
cf20: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cf30: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
cf40: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
cf50: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
cf60: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
cf70: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
cf80: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
cf90: 28 20 7a 46 69 6c 65 3d 3d 30 20 7c 7c 20 7a 46  ( zFile==0 || zF
cfa0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ile[0]==0 ){.   
cfb0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
cfc0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
cfd0: 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
cfe0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
cff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d000: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
d010: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
d020: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
d030: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
d040: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
d050: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
d060: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
d070: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
d080: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
d090: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
d0a0: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
d0b0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
d0c0: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
d0d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d0e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d0f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
d100: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
d110: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d120: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
d130: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
d140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
d150: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
d160: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
d170: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
d180: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
d190: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
d1a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d1b0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
d1c0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
d1d0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
d1e0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
d1f0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
d200: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
d210: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
d220: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
d230: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
d240: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
d250: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
d260: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
d270: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d280: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
d290: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
d2a0: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
d2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
d2c0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
d2d0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d2e0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
d2f0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
d300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d310: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d320: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d330: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
d340: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
d350: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
d360: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d370: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
d380: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
d390: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
d3a0: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
d3b0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
d3c0: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
d3d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
d3e0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
d3f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d400: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
d410: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
d420: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
d430: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
d440: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
d450: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
d460: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
d470: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
d480: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
d490: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d4a0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
d4b0: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
d4c0: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
d4d0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
d4e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d4f0: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
d500: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
d510: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
d520: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
d530: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
d540: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d550: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d560: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d570: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
d580: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d590: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d5a0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d5b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d5c0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d5d0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
d5e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d5f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
d600: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
d610: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d630: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d640: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
d650: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d660: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
d670: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d680: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
d690: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
d6a0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
d6b0: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
d6c0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
d6d0: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
d6e0: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
d6f0: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
d700: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
d710: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
d720: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
d730: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
d740: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
d750: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d760: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d770: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
d780: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d790: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d7a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
d7b0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
d7c0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
d7d0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
d7e0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
d7f0: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
d800: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
d810: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
d820: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
d830: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
d840: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
d850: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
d860: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
d870: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
d880: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
d890: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
d8a0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
d8b0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
d8c0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
d8d0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
d8e0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
d8f0: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
d900: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
d910: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
d920: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
d930: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
d940: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
d950: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
d960: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
d970: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
d980: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d990: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d9a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
d9b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
d9c0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
d9d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
d9e0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
d9f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
da00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
da10: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
da20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
da30: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
da40: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
da50: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
da60: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
da70: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
da80: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
da90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
daa0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
dab0: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
dac0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
dad0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
dae0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
daf0: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
db00: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
db10: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
db20: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
db30: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
db40: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
db50: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
db60: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
db70: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
db80: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
db90: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
dba0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
dbb0: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
dbc0: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
dbd0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
dbe0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
dbf0: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
dc00: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
dc10: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
dc20: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
dc30: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
dc40: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
dc50: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
dc60: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
dc70: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
dc80: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
dc90: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
dca0: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
dcb0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
dcc0: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
dcd0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
dce0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
dcf0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
dd00: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
dd10: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
dd20: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
dd30: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
dd40: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
dd50: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
dd60: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
dd70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
dd80: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
dd90: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
dda0: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
ddb0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
ddc0: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
ddd0: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
dde0: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
ddf0: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
de00: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
de10: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
de20: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
de30: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
de40: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
de50: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
de60: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
de70: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
de80: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
de90: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
dea0: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
deb0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
dec0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ded0: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
dee0: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
def0: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
df00: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
df10: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
df20: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
df30: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
df40: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
df50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
df60: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
df70: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
df80: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
df90: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
dfa0: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
dfb0: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
dfc0: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
dfd0: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
dfe0: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
dff0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
e000: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
e010: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
e020: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
e030: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
e040: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
e050: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
e060: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
e070: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
e080: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
e090: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
e0a0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
e0b0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
e0c0: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
e0d0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
e0e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
e0f0: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
e100: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
e110: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
e120: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
e130: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
e140: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e150: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
e160: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
e170: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
e180: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
e190: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
e1a0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e1b0: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
e1c0: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
e1d0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
e1e0: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
e1f0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
e200: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
e210: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
e220: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
e230: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
e240: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
e250: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
e260: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
e270: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
e280: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
e290: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
e2a0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
e2b0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
e2c0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
e2d0: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
e2e0: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
e2f0: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
e300: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
e310: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
e320: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e330: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
e340: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
e350: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
e360: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
e370: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
e380: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e390: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
e3a0: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
e3b0: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
e3c0: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
e3d0: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
e3e0: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
e3f0: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
e400: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
e410: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
e420: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
e430: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
e440: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
e450: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
e460: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
e470: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
e480: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
e490: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
e4a0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
e4b0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
e4c0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
e4d0: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
e4e0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
e4f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
e500: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
e510: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
e520: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
e530: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
e540: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
e550: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e560: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e570: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
e580: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
e590: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e5a0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e5b0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
e5c0: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
e5d0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e5e0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
e5f0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
e600: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
e610: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
e620: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
e630: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e640: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
e650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e660: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e670: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
e680: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
e690: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
e6a0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
e6b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
e6c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e6d0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
e6e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e6f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
e700: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
e710: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
e720: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
e730: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
e740: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
e750: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
e760: 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
e770: 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
e780: 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
e790: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
e7a0: 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
e7b0: 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
e7c0: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
e7d0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e7e0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
e7f0: 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
e800: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
e810: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
e820: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
e830: 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
e840: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e850: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
e860: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
e870: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
e880: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
e890: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
e8a0: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
e8b0: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
e8c0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
e8d0: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
e8e0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
e8f0: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
e900: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
e910: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
e920: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
e930: 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65 74  ing so it.** set
e940: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
e950: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
e960: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
e970: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
e980: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
e990: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
e9a0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
e9b0: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
e9c0: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
e9d0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
e9e0: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
e9f0: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
ea00: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
ea10: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
ea20: 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73 20  eeEnterAll() is 
ea30: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
ea40: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
ea50: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
ea60: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
ea70: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
ea80: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
ea90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
eaa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
eab0: 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75 72   the VM. Of cour
eac0: 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65 74  se only a subset
ead0: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
eae0: 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ures.** will be 
eaf0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
eb00: 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c 64  VM, and we could
eb10: 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65 4d   use Vdbe.btreeM
eb20: 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a  ask to figure.**
eb30: 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75 74   that subset out
eb40: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
eb50: 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 64  o advantage to d
eb60: 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49  oing so..**.** I
eb70: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
eb80: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
eb90: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
eba0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
ebb0: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
ebc0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
ebd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
ebe0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ebf0: 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  CHE.void sqlite3
ec00: 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e  VdbeMutexArrayEn
ec10: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ter(Vdbe *p){.#i
ec20: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
ec30: 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74 72  AFE.  sqlite3Btr
ec40: 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  eeMutexArrayEnte
ec50: 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 23  r(&p->aMutex);.#
ec60: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42 74  else.  sqlite3Bt
ec70: 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e 64  reeEnterAll(p->d
ec80: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  b);.#endif.}.#en
ec90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
eca0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
ecb0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
ecc0: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
ecd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
ece0: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
ecf0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
ed00: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
ed10: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
ed20: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
ed30: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
ed40: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
ed50: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
ed60: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
ed70: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
ed80: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
ed90: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
eda0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
edb0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
edc0: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
edd0: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
ede0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
edf0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
ee00: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
ee10: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
ee20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
ee30: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
ee40: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
ee50: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
ee60: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
ee70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee80: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
ee90: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
eea0: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
eeb0: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
eec0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
eed0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
eee0: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
eef0: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
ef00: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
ef10: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
ef20: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
ef30: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ef40: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
ef50: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
ef60: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
ef70: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
ef80: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
ef90: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
efa0: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
efb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
efc0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
efd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
efe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
eff0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f000: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
f010: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
f020: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
f030: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
f040: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
f050: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
f060: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
f070: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
f080: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
f090: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
f0a0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
f0b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f0c0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
f0d0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
f0e0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
f0f0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
f100: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
f110: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
f120: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
f130: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
f140: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
f150: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
f160: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
f170: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f180: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
f190: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
f1a0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
f1b0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
f1c0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
f1d0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
f1e0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
f1f0: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
f200: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
f210: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
f220: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
f230: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
f240: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
f250: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
f280: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
f290: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
f2a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f2b0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
f2c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
f2d0: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
f2e0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
f2f0: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
f300: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
f310: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
f320: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
f330: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
f340: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
f350: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
f360: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
f370: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
f380: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
f390: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
f3a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
f3b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
f3c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
f3d0: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
f3e0: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
f3f0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
f400: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
f410: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
f420: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
f430: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
f440: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
f450: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
f460: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
f470: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f480: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
f490: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
f4a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
f4b0: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
f4c0: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
f4d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
f4e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
f4f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f500: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
f510: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
f520: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
f530: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
f540: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
f550: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
f560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f570: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
f580: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
f590: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
f5a0: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
f5b0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
f5c0: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
f5d0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
f5e0: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
f5f0: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
f600: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
f610: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
f620: 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
f630: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
f640: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
f650: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
f660: 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
f670: 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
f680: 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
f690: 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
f6a0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
f6b0: 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72  ite3VdbeMutexArr
f6c0: 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  ayEnter(p);..   
f6d0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
f6e0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
f6f0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
f700: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
f710: 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  f;.    assert( p
f720: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc!=SQLITE_IOE
f730: 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f  RR_BLOCKED );  /
f740: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20  * This error no 
f750: 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f  longer exists */
f760: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
f770: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
f780: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
f790: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
f7c0: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
f7d0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
f7e0: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
f7f0: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
f800: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
f810: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
f820: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
f830: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
f840: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
f850: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
f860: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
f870: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
f880: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
f890: 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
f8a0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
f8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
f8c0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
f8d0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
f8e0: 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
f8f0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
f900: 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
f910: 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
f920: 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
f930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f940: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
f950: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
f960: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
f970: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
f980: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
f990: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
f9a0: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
f9b0: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
f9c0: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
f9d0: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
f9e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
f9f0: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
fa00: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
fa10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
fa20: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
fa30: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
fa40: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
fa50: 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
fa60: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
fa70: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
fa80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fa90: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
faa0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
fab0: 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
fac0: 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
fad0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
fae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
faf0: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
fb00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
fb10: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
fb20: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
fb30: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
fb40: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
fb50: 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
fb60: 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
fb70: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
fb80: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
fb90: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
fba0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
fbb0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
fbc0: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
fbd0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
fbe0: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
fbf0: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
fc00: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
fc10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc20: 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
fc30: 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
fc40: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
fc50: 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
fc60: 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
fc70: 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
fc80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
fc90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
fca0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
fcb0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
fcc0: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
fcd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
fce0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
fcf0: 70 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  p, 1) ){.       
fd00: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
fd10: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
fd20: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
fd30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
fd50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
fd60: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
fd70: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
fd80: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
fd90: 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
fda0: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
fdb0: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
fdc0: 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
fdd0: 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
fde0: 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
fdf0: 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
fe00: 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
fe10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fe20: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
fe30: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
fe40: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
fe50: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
fe60: 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
fe70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
fe80: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
fe90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
fea0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
feb0: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
fec0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
fed0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
fee0: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
fef0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ff00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
ff10: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
ff20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
ff30: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
ff40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ff50: 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
ff60: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
ff70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
ff80: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
ff90: 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
ffa0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
ffb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ffc0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
ffd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
ffe0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
fff0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
10000 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
10010 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
10020 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
10030 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
10040 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
10050 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
10060 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
10070 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
10080 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
10090 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
100a0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
100b0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
100c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
100d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
100e0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
100f0 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
10100 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
10110 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10120 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10130 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
10140 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
10150 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
10160 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
10170 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
10180 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
10190 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
101a0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
101b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
101c0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
101d0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
101e0 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
101f0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10200 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
10210 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
10220 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
10230 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
10240 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
10250 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
10260 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
10270 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
10280 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
10290 65 6e 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  en set the error
102a0 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20  .    ** code to 
102b0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20  the new value.. 
102c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
102d0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
102e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
102f0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10300 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
10310 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
10320 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
10330 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
10340 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
10350 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NT) ){.        p
10360 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
10370 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10380 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
10390 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
103a0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
103b0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
103c0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
103d0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
103e0 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
103f0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10400 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
10410 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
10420 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
10430 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10440 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
10450 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
10460 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
10470 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
10480 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
10490 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
104a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
104b0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
104c0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
104d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
104e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
104f0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
10500 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10510 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
10520 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
10530 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
10540 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
10550 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
10560 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
10570 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
10580 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
10590 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
105a0 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
105b0 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
105c0 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
105d0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
105e0 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
105f0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
10600 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
10610 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
10620 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
10630 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
10640 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
10650 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
10660 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
10670 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
10680 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
10690 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
106a0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
106b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
106c0 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
106d0 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
106e0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
106f0 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
10700 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
10710 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
10720 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
10730 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
10740 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
10750 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
10760 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10770 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
10780 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
10790 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
107a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
107b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
107c0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
107d0 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
107e0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
107f0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
10800 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
10810 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
10820 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
10830 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
10840 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
10850 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
10860 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
10870 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
10880 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
10890 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
108a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
108b0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
108c0 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
108d0 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
108e0 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
108f0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
10900 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
10910 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
10920 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10930 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
10940 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
10950 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
10960 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
10970 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
10980 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10990 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
109a0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
109b0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
109c0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
109d0 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
109e0 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
109f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10a00 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
10a10 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
10a20 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
10a30 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
10a40 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
10a50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
10a60 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
10a70 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
10a80 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
10a90 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
10aa0 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
10ab0 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
10ac0 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
10ad0 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
10ae0 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
10af0 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
10b00 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
10b10 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10b20 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
10b30 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
10b40 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
10b50 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
10b60 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
10b70 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
10b80 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
10b90 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
10ba0 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
10bb0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
10bc0 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
10bd0 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
10be0 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
10bf0 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
10c00 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
10c10 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
10c20 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
10c30 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
10c40 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28  it now..  */.  (
10c50 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
10c60 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69  tyOn(db);.  sqli
10c70 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
10c80 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
10c90 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20  afetyOff(db);.. 
10ca0 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
10cb0 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
10cc0 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
10cd0 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
10ce0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
10cf0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
10d00 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
10d10 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
10d20 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
10d30 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
10d40 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
10d50 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
10d60 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
10d70 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
10d80 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
10d90 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
10da0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
10db0 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
10dc0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
10dd0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
10de0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
10df0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
10e00 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
10e10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
10e20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
10e30 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c  Str(db->pErr,-1,
10e40 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54  p->zErrMsg,SQLIT
10e50 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
10e60 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
10e70 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
10e80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
10e90 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
10ea0 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >rc;.      sqlit
10eb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
10ec0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
10ed0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
10ee0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
10ef0 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
10f00 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
10f10 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
10f20 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
10f30 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10f40 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
10f50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
10f60 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
10f70 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
10f80 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
10f90 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
10fa0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
10fb0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
10fc0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
10fd0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
10fe0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
10ff0 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
11000 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
11010 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
11020 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
11030 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
11040 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11050 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
11060 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11070 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
11080 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
11090 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
110a0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
110b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
110c0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
110d0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
110e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
110f0 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
11100 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
11110 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
11120 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
11130 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
11140 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
11150 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
11160 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
11170 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
11180 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
11190 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
111a0 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
111b0 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
111c0 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
111d0 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
111e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
111f0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
11200 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
11210 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
11220 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
11230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
11240 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
11250 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11260 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
11270 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
11280 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
11290 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
112a0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
112b0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
112c0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
112d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
112e0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
112f0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
11300 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
11310 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
11320 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11330 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
11340 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
11350 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
11360 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
11370 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
11380 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
11390 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
113a0 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
113b0 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
113c0 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
113d0 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
113e0 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
113f0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
11400 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
11410 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
11420 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
11430 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
11440 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
11450 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
11460 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
11470 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11480 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
11490 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
114a0 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
114b0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
114c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
114d0 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
114e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
114f0 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
11500 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
11510 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
11520 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
11540 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
11550 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
11560 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
11570 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
11580 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
11590 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
115a0 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
115b0 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
115c0 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
115d0 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
115e0 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
115f0 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
11600 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
11610 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
11620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11630 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
11640 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
11650 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
11660 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
11670 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
11680 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
11690 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
116a0 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
116b0 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
116c0 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
116d0 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31   !(mask&(((u32)1
116e0 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  )<<i))) && pAux-
116f0 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
11700 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
11710 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
11720 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
11730 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
11740 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
11750 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
11760 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
11770 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
11780 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
11790 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
117a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
117b0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
117c0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
117d0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
117e0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
117f0 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
11800 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
11810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
11820 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
11830 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
11840 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
11850 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
11860 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
11870 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
11880 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ev;.  }.  releas
11890 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
118a0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
118b0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
118c0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
118d0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
118e0 45 5f 4e 29 3b 0a 20 20 76 64 62 65 46 72 65 65  E_N);.  vdbeFree
118f0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
11900 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
11910 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11920 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73   p->aLabel);.  s
11930 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11940 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
11950 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11960 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70  b, p->zSql);.  p
11970 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
11980 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
11990 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
119a0 2d 3e 70 46 72 65 65 29 3b 0a 20 20 70 2d 3e 64  ->pFree);.  p->d
119b0 62 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69  b = NULL;.  sqli
119c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
119d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
119e0 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  sure the cursor 
119f0 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65  p is ready to re
11a00 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
11a10 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a  row to which it.
11a20 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69  ** was last posi
11a30 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20  tioned.  Return 
11a40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
11a50 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72   an OOM fault or
11a60 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72   I/O error.** pr
11a70 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70  events us from p
11a80 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63  ositioning the c
11a90 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72  ursor to its cor
11aa0 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rect position..*
11ab0 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
11ac0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
11ad0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
11ae0 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
11af0 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
11b00 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f  o now.  If no mo
11b10 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63  ve is pending, c
11b20 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
11b30 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a  he row has been.
11b40 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  ** deleted out f
11b50 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
11b60 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68  rsor and if it h
11b70 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77  as, mark the row
11b80 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f   as.** a NULL ro
11b90 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
11ba0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
11bb0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
11bc0 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e  e correct row an
11bd0 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a  d that row has.*
11be0 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74  * not been delet
11bf0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
11c00 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  r the cursor, th
11c10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
11c20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
11c30 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
11c40 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43  rsorMoveto(VdbeC
11c50 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
11c60 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
11c70 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
11c80 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  s, rc;.#ifdef SQ
11c90 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78  LITE_TEST.    ex
11ca0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
11cb0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
11cc0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
11cd0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
11ce0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11cf0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
11d00 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ked(p->pCursor, 
11d10 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
11d20 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
11d30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11d40 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73  n rc;.    p->las
11d50 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65  tRowid = p->move
11d60 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 70 2d  toTarget;.    p-
11d70 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
11d80 41 4c 57 41 59 53 28 72 65 73 3d 3d 30 29 20 3f  ALWAYS(res==0) ?
11d90 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  1:0;.    if( NEV
11da0 45 52 28 72 65 73 3c 30 29 20 29 7b 0a 20 20 20  ER(res<0) ){.   
11db0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11dc0 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
11dd0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
11de0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11df0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64  n rc;.    }.#ifd
11e00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
11e10 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
11e20 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
11e30 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
11e40 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
11e50 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
11e60 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
11e70 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
11e80 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
11e90 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
11ea0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
11eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
11ec0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
11ed0 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
11ee0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
11ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
11f00 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
11f10 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
11f20 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
11f30 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
11f40 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
11f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11f60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11f70 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
11f80 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
11f90 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
11fa0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
11fb0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
11fc0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
11fd0 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
11fe0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
11ff0 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
12000 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
12010 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
12020 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
12030 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
12040 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
12050 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
12060 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
12070 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
12080 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
12090 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
120a0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
120b0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
120c0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
120d0 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
120e0 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
120f0 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
12100 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
12110 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
12120 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
12130 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
12140 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
12150 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
12160 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
12170 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
12180 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
12190 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
121a0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
121b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
121c0 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
121d0 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
121e0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
121f0 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
12200 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
12210 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
12220 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
12230 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
12240 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
12250 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12260 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
12270 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
12280 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
12290 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
122a0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
122b0 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
122c0 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
122d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
122e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
122f0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
12300 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12330 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
12360 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
12370 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12390 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
123a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
123b0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
123c0 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
123d0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
123e0 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
12410 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
12420 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
12430 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
12440 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
12450 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
12480 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
12490 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
124b0 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
124c0 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
124f0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
12500 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
12530 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
12540 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12570 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
12580 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
12590 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
125a0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
125b0 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
125c0 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
125d0 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
125e0 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
125f0 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
12600 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
12610 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
12620 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
12630 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
12640 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
12650 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
12660 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
12670 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
12680 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
12690 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
126a0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
126b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
126c0 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
126d0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
126e0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
126f0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
12700 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
12710 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
12720 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
12730 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
12740 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
12750 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
12760 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
12770 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
12780 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
12790 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
127a0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
127b0 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
127c0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
127d0 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
127e0 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
127f0 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
12800 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
12810 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c      }.    u = i<
12820 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20  0 ? -i : i;.    
12830 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
12840 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
12850 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
12860 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
12870 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
12880 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
12890 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
128a0 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
128b0 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
128c0 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
128d0 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
128e0 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
128f0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
12900 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
12910 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
12920 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
12930 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
12940 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
12950 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
12960 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
12970 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
12980 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
12990 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
129a0 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
129b0 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
129c0 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
129d0 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
129e0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
129f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
12a00 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
12a10 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
12a20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12a30 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
12a40 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
12a50 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
12a60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
12a70 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
12a80 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
12a90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
12aa0 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
12ab0 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
12ac0 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
12ad0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
12ae0 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
12af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
12b00 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
12b10 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
12b20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
12b30 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
12b40 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
12b50 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
12b60 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
12b70 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
12b80 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
12b90 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
12ba0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
12bb0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
12bc0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
12bd0 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
12be0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
12bf0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
12c00 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
12c10 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
12c20 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
12c30 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
12c40 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
12c50 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
12c60 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
12c70 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
12c80 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
12c90 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
12ca0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
12cb0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
12cc0 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
12cd0 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
12ce0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
12cf0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
12d00 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
12d10 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
12d20 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
12d30 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
12d40 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
12d50 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
12d60 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
12d70 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
12d80 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
12d90 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
12da0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
12db0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
12dc0 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
12dd0 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
12de0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
12df0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
12e00 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
12e10 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
12e20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
12e30 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
12e40 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
12e50 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
12e60 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
12e70 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
12e80 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
12e90 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
12ea0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
12eb0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
12ec0 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
12ed0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
12ee0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
12ef0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
12f00 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
12f10 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
12f20 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
12f30 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
12f40 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
12f50 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
12f60 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
12f70 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
12f80 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
12f90 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
12fa0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
12fb0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
12fc0 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
12fd0 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
12fe0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
12ff0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
13000 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
13010 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
13020 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
13030 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
13040 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
13050 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
13060 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
13070 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
13080 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
13090 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
130a0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
130b0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
130c0 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
130d0 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
130e0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
130f0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
13100 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
13110 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
13120 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
13130 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
13140 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
13150 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
13160 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
13170 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
13180 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
13190 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
131a0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
131b0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
131c0 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
131d0 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
131e0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
131f0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
13200 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
13210 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
13220 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
13230 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
13240 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
13250 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
13260 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
13270 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
13280 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
13290 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
132a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
132b0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
132c0 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
132d0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
132e0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
132f0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
13300 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
13310 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
13320 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
13330 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
13340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13350 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
13360 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
13370 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
13380 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
13390 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
133a0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
133b0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
133c0 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
133d0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
133e0 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
133f0 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
13400 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
13410 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
13420 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
13430 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
13440 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
13450 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
13460 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
13470 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
13480 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
13490 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
134a0 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
134b0 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
134c0 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
134d0 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
134e0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
134f0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
13500 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
13510 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
13520 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
13530 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
13540 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
13550 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13560 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
13570 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
13580 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
13590 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
135a0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
135b0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
135c0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
135d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
135e0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
135f0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
13600 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
13610 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
13620 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
13630 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
13640 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
13650 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
13660 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
13670 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13680 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
13690 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
136a0 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
136b0 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
136c0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
136d0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
136e0 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
136f0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
13700 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
13710 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13720 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
13730 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
13740 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
13750 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
13760 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
13770 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
13780 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
13790 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
137a0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
137b0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
137c0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
137d0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
137e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
137f0 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
13800 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
13810 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
13820 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
13830 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
13840 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
13850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
13860 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
13870 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
13880 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
13890 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
138a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
138b0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
138c0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
138d0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
138e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
138f0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
13900 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
13910 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
13920 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
13930 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
13940 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
13950 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
13960 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
13970 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
13980 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
13990 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
139a0 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
139b0 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
139c0 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
139d0 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
139e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
139f0 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
13a00 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
13a10 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
13a20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
13a30 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
13a40 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
13a50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
13a60 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
13a70 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
13a80 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
13a90 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
13aa0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
13ab0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
13ac0 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
13ad0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13ae0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
13af0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
13b00 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
13b10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
13b20 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
13b30 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
13b40 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
13b50 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
13b60 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
13b70 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
13b80 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
13b90 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
13bc0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
13bd0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
13be0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
13bf0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
13c00 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
13c10 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
13c20 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
13c30 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
13c40 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
13c50 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
13c60 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
13c70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
13c80 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
13c90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
13ca0 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
13cb0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
13cc0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
13cd0 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
13ce0 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
13cf0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13d00 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13d10 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
13d20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
13d30 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13d40 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
13d50 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
13d60 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
13d70 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
13d80 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
13d90 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
13da0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
13db0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
13dc0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
13dd0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
13de0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
13df0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
13e00 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
13e10 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
13e20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
13e30 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
13e40 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
13e50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
13e60 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
13e70 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
13e80 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
13e90 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
13ea0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
13eb0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
13ec0 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
13ed0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
13ee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
13ef0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13f00 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
13f10 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
13f20 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
13f30 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
13f40 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
13f50 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
13f60 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
13f70 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
13f80 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
13f90 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
13fa0 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
13fb0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
13fc0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
13fd0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13fe0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13ff0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
14000 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
14010 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14020 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
14030 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
14040 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
14050 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
14060 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
14070 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
14080 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14090 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
140a0 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
140b0 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
140c0 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
140d0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
140e0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
140f0 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
14100 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
14110 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
14120 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
14130 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
14140 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
14150 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
14160 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
14170 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
14180 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
14190 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
141a0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
141b0 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
141c0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
141d0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
141e0 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
141f0 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
14200 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14210 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
14220 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
14230 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
14240 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
14250 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
14260 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
14270 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
14280 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
14290 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
142a0 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
142b0 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
142c0 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
142d0 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
142e0 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
142f0 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
14300 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
14310 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
14320 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
14330 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
14340 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
14350 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
14360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
14370 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
14380 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
14390 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
143a0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
143b0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
143c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
143d0 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
143e0 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
143f0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
14400 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
14410 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
14420 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
14430 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
14440 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
14450 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
14460 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
14470 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
14480 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
14490 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
144a0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
144b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
144c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
144d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
144e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
144f0 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
14500 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
14510 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
14520 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
14530 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
14540 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
14550 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
14560 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
14570 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
14580 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
14590 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
145a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
145b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
145c0 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
145d0 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
145e0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
145f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14600 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
14610 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
14620 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
14630 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
14640 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20  ], parse the.** 
14650 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e  record into a Un
14660 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
14670 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
14680 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
14690 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
146a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
146b0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
146c0 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
146d0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
146e0 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
146f0 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
14700 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
14710 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
14720 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
14730 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
14740 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
14750 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
14760 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
14770 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
14780 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
14790 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
147a0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
147b0 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
147c0 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
147d0 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
147e0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
147f0 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f  ckedRecord()..*/
14800 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   .UnpackedRecord
14810 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63   *sqlite3VdbeRec
14820 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
14830 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
14840 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
14850 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
14860 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
14870 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
14880 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14890 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
148a0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
148b0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
148c0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
148d0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
148e0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
148f0 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
14900 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
14910 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74   hold the object
14920 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
14930 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
14940 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
14950 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
14960 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14970 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
14980 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14990 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70  ar *)pKey;.  Unp
149a0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
149b0 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64   /* The unpacked
149c0 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65 20   record that we 
149d0 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20  will return */. 
149e0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
149f0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
14a00 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68  pace needed to h
14a10 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20  old p, in bytes 
14a20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33  */.  int d;.  u3
14a30 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20  2 idx;.  u16 u; 
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a50 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
14a60 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
14a70 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
14a80 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  m;.  int nOff;  
14a90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
14aa0 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20 74  ease pSpace by t
14ab0 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79  his much to 8-by
14ac0 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  te align it */. 
14ad0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77   .  /*.  ** We w
14ae0 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
14af0 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
14b00 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
14b10 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
14b20 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
14b30 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
14b40 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
14b50 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
14b60 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
14b70 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
14b80 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
14b90 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
14ba0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
14bb0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
14bc0 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
14bd0 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
14be0 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70  ) & 7)) & 7;.  p
14bf0 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20  Space += nOff;. 
14c00 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66   szSpace -= nOff
14c10 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
14c20 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
14c30 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
14c40 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
14c50 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
14c60 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
14c70 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
14c80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
14c90 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
14ca0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
14cb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14cc0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
14cd0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
14ce0 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  E | UNPACKED_NEE
14cf0 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c  D_DESTROY;.  }el
14d00 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
14d10 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70  ackedRecord*)pSp
14d20 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ace;.    p->flag
14d30 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s = UNPACKED_NEE
14d40 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20  D_DESTROY;.  }. 
14d50 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
14d60 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
14d70 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
14d80 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70  >nField + 1;.  p
14d90 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
14da0 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
14db0 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
14dc0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
14dd0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
14de0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
14df0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
14e00 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
14e10 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
14e20 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
14e30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
14e40 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46  szHdr && u<p->nF
14e50 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20  ield && d<=nKey 
14e60 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
14e70 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
14e80 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
14e90 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
14ea0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
14eb0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
14ec0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
14ed0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
14ee0 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->db;.    pMem->
14ef0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  flags = 0;.    p
14f00 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
14f10 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
14f20 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
14f30 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
14f40 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
14f50 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
14f60 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
14f70 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
14f80 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
14f90 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72  >nField = u;.  r
14fa0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
14fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14fc0 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
14fd0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
14fe0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
14ff0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15000 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
15010 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15020 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
15030 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73  em *pMem;..  ass
15040 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
15050 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20  ssert( p->flags 
15060 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
15070 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72  DESTROY );.  for
15080 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d  (i=0, pMem=p->aM
15090 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  em; i<p->nField;
150a0 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
150b0 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b     /* The unpack
150c0 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77  ed record is alw
150d0 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ays constructed 
150e0 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  by the.    ** sq
150f0 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52  lite3VdbeUnpackR
15100 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
15110 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61   above, which ma
15120 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  kes all.    ** s
15130 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
15140 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f   static.  And no
15150 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ne of the elemen
15160 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76  ts are.    ** ev
15170 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20  er transformed, 
15180 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
15190 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65  r anything to de
151a0 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lete..    */.   
151b0 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d   if( NEVER(pMem-
151c0 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69  >zMalloc) ) sqli
151d0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
151e0 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  e(pMem);.  }.  i
151f0 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  f( p->flags & UN
15200 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
15210 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
15220 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66  bFree(p->pKeyInf
15230 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  o->db, p);.  }.}
15240 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15250 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
15260 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
15270 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
15280 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
15290 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
152a0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
152b0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
152c0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
152d0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
152e0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
152f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
15300 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
15310 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
15320 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
15330 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
15340 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
15350 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
15360 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
15370 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
15380 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
15390 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
153a0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
153b0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
153c0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
153d0 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
153e0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
153f0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
15400 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
15410 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
15420 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
15430 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
15440 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
15450 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
15460 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
15470 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
15480 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
15490 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
154a0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
154b0 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
154c0 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
154d0 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
154e0 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
154f0 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
15500 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
15510 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
15520 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
15530 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
15540 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
15550 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
15560 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
15570 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
15580 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
15590 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
155a0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
155b0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
155c0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
155d0 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
155e0 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
155f0 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
15600 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
15610 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
15620 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
15630 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
15640 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
15650 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
15660 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
15670 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
15680 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
15690 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
156a0 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
156b0 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
156c0 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
156d0 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
156e0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
156f0 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
15700 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
15710 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
15720 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
15730 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
15740 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
15750 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
15760 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
15770 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
15780 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
15790 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
157a0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
157b0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
157c0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
157d0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
157e0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
157f0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
15800 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
15810 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
15820 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
15830 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
15840 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
15850 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
15860 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
15870 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
15880 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
15890 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
158a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
158b0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
158c0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
158d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
158e0 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
158f0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
15900 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
15910 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
15920 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
15930 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15940 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
15950 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
15960 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
15970 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
15980 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
15990 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
159a0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
159b0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
159c0 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
159d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
159e0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
159f0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
15a00 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  .zMalloc = 0; ) 
15a10 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
15a20 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
15a30 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
15a40 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
15a50 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
15a60 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
15a70 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
15a80 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
15a90 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
15aa0 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
15ab0 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
15ac0 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
15ad0 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
15ae0 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
15af0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
15b00 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  d initialized, a
15b10 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
15b20 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
15b30 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
15b40 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
15b50 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
15b60 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
15b70 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
15b80 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
15b90 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
15ba0 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
15bb0 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
15bc0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
15bd0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
15be0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
15bf0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
15c00 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
15c10 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
15c20 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
15c30 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
15c40 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
15c50 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
15c60 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
15c70 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
15c80 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
15c90 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e  s & UNPACKED_IGN
15ca0 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  ORE_ROWID ){.   
15cb0 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20   szHdr1--;.  }. 
15cc0 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
15cd0 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
15ce0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
15cf0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
15d00 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
15d10 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
15d20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
15d30 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
15d40 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
15d50 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
15d60 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
15d70 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
15d80 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
15d90 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
15da0 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
15db0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15dc0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
15dd0 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
15de0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
15df0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
15e00 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
15e10 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
15e20 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
15e30 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
15e40 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
15e50 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
15e60 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
15e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15e80 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
15e90 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
15ea0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
15ed0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
15ee0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
15ef0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
15f00 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
15f10 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
15f20 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
15f30 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
15f40 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
15f50 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
15f60 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
15f70 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
15f80 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
15f90 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
15fa0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
15fb0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
15fc0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
15fd0 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
15fe0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
15ff0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
16000 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
16010 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
16020 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
16030 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
16040 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
16050 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
16060 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
16070 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
16080 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
16090 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
160a0 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
160b0 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
160c0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
160d0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
160e0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
160f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
16100 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
16110 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
16120 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
16130 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
16140 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16150 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
16160 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
16170 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
16180 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
16190 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
161a0 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
161b0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
161c0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
161d0 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
161e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
161f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16200 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
16210 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
16220 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
16230 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
16240 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
16250 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
16260 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
16270 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
16280 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
16290 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
162a0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
162b0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
162c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
162d0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
162e0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
162f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
16300 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
16310 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
16320 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
16330 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
16340 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
16350 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
16360 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
16370 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
16380 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
16390 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
163a0 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
163b0 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
163c0 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
163d0 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
163e0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
163f0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
16400 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
16410 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
16420 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
16430 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
16440 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
16450 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
16460 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
16470 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
16480 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
16490 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
164a0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
164b0 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
164c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
164d0 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
164e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
164f0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
16500 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
16510 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
16520 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
16530 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
16540 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
16550 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
16560 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
16570 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
16580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16590 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
165a0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
165b0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
165c0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
165d0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
165e0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
165f0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
16600 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
16610 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
16620 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
16630 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
16640 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
16650 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
16660 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
16670 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
16680 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
16690 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
166a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
166b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
166c0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
166d0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
166e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
166f0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
16700 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
16710 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
16720 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
16730 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
16740 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
16750 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
16760 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
16770 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
16780 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
16790 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
167a0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
167b0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
167c0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
167d0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
167e0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
167f0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
16800 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16810 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
16820 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
16830 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
16840 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
16850 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
16860 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
16870 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
16880 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
16890 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
168a0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
168b0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
168c0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
168d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
168e0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
168f0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
16900 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
16910 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
16920 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
16930 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
16940 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
16950 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
16960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16970 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
16980 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
16990 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
169a0 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
169b0 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
169c0 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
169d0 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
169e0 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
169f0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
16a00 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
16a10 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
16a20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
16a30 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
16a40 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
16a50 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
16a60 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
16a70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
16a80 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
16a90 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
16aa0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
16ab0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
16ac0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
16ad0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
16ae0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
16af0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
16b00 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
16b10 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
16b20 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
16b30 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
16b40 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
16b50 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
16b60 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
16b70 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
16b80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
16b90 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
16ba0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
16bb0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
16bc0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
16bd0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
16be0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
16bf0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
16c00 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
16c10 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
16c20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
16c30 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
16c40 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
16c50 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
16c60 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
16c70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
16c80 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
16c90 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
16ca0 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
16cb0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
16cc0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
16cd0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
16ce0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
16cf0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
16d00 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
16d10 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
16d20 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
16d30 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
16d40 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
16d50 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
16d60 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
16d70 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
16d80 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
16d90 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
16da0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
16db0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
16dc0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
16dd0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
16de0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
16df0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
16e00 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
16e10 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
16e20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
16e30 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
16e40 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
16e50 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
16e60 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
16e70 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
16e80 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
16e90 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
16ea0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
16eb0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
16ec0 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
16ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
16ee0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
16ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
16f00 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
16f10 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
16f20 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
16f30 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
16f40 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
16f50 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
16f60 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
16f70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
16f80 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
16f90 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
16fa0 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
16fb0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
16fc0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
16fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16fe0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
17000 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
17010 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
17020 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
17030 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
17040 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
17050 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
17060 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
17070 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
17080 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
17090 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
170a0 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
170b0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
170c0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
170d0 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
170e0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
170f0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
17100 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
17110 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
17120 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
17130 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
17140 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
17150 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
17160 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
17170 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
17180 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
17190 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
171a0 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
171b0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
171c0 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
171d0 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
171e0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
171f0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
17200 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
17210 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
17220 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
17230 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
17240 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
17250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
17260 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
17270 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
17280 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
17290 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70  npacked,  /* Unp
172a0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
172b0 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20   key to compare 
172c0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74  against */.  int
172d0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
172e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
172f0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
17300 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
17310 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
17320 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
17330 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17340 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
17350 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73  .  Mem m;..  ass
17360 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
17370 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
17380 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  Cur) );.  rc = s
17390 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
173a0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
173b0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
173c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
173d0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
173e0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
173f0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
17400 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
17410 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
17420 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
17430 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
17440 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
17450 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
17460 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
17470 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
17480 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
17490 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
174a0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
174b0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
174c0 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
174d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
174e0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
174f0 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
17500 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
17510 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
17520 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
17530 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
17540 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
17550 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17570 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
17580 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
17590 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
175a0 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
175b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
175c0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
175d0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
175e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
175f0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
17600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17620 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
17630 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
17640 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
17650 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
17660 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
17670 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17680 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
17690 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
176a0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
176b0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
176c0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
176d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
176e0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
176f0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
17700 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
17710 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
17720 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
17730 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
17740 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
17750 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
17760 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
17770 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
17780 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
17790 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
177a0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
177b0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
177c0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
177d0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
177e0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
177f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17800 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
17810 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
17820 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
17830 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
17840 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
17850 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
17860 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
17870 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
17880 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
17890 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
178a0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
178b0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
178c0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
178d0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
178e0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
178f0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
17900 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
17910 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
17920 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
17930 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
17940 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
17950 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17960 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
17970 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
17980 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
17990 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
179a0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
179b0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
179c0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
179d0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
179e0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
179f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
17a00 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
17a10 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
17a20 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
17a30 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
17a40 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
17a50 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
17a60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
17a70 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
17a80 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
17a90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
17aa0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
17ab0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
17ac0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
17ad0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
17ae0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
17af0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
17b00 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
17b10 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
17b20 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
17b30 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
17b40 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
17b50 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
17b60 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
17b70 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
17b80 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
17b90 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
17ba0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
17bb0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
17bc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
17bd0 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
17be0 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
17bf0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
17c00 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
17c10 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
17c20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
17c30 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
17c40 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
17c50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
17c60 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
17c70 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
17c80 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
17c90 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
17ca0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
17cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17cc0 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
17cd0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
17ce0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
17cf0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
17d00 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
17d10 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73  UTF8);.        s
17d20 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
17d30 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52  reType((Mem *)pR
17d40 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
17d50 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
17d60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17d70 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
17d80 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
17d90 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
17da0 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
17db0 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
17dc0 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
17dd0 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
17de0 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
17df0 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
17e00 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
17e10 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
17e20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
17e30 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
17e40 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
17e50 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
17e60 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
17e70 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
17e80 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
17e90 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
17ea0 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
17eb0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
17ec0 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
17ed0 0a                                               .