/ Hex Artifact Content
Login

Artifact 55f467c7da95d70e039f1e2c9038511b7c2f5b5a:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 38 30 20 32  eaux.c,v 1.480 2
02c0: 30 30 39 2f 30 38 2f 30 38 20 31 38 3a 30 31 3a  009/08/08 18:01:
02d0: 30 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a  08 drh Exp $.*/.
02e0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
02f0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0300: 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a 0a 2f  "vdbeInt.h"..../
0310: 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62 75 67 67  *.** When debugg
0320: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 67 65 6e  ing the code gen
0330: 65 72 61 74 6f 72 20 69 6e 20 61 20 73 79 6d 62  erator in a symb
0340: 6f 6c 69 63 20 64 65 62 75 67 67 65 72 2c 20 6f  olic debugger, o
0350: 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74 20 74 68  ne can.** set th
0360: 65 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  e sqlite3VdbeAdd
0370: 6f 70 54 72 61 63 65 20 74 6f 20 31 20 61 6e 64  opTrace to 1 and
0380: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 77 69 6c   all opcodes wil
0390: 6c 20 62 65 20 70 72 69 6e 74 65 64 0a 2a 2a 20  l be printed.** 
03a0: 61 73 20 74 68 65 79 20 61 72 65 20 61 64 64 65  as they are adde
03b0: 64 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  d to the instruc
03c0: 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  tion stream..*/.
03d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
03e0: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  BUG.int sqlite3V
03f0: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 3d 20  dbeAddopTrace = 
0400: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
0410: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 76  * Create a new v
0420: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
0430: 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20  engine..*/.Vdbe 
0440: 2a 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61  *sqlite3VdbeCrea
0450: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  te(sqlite3 *db){
0460: 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20  .  Vdbe *p;.  p 
0470: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0480: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0490: 28 56 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20  (Vdbe) );.  if( 
04a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
04b0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
04c0: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
04d0: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
04e0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
04f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0500: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0510: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
0520: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
0530: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
0540: 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
0550: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  p;.}../*.** Reme
0560: 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72  mber the SQL str
0570: 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72  ing for a prepar
0580: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ed statement..*/
0590: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
05a0: 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c  eSetSql(Vdbe *p,
05b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
05c0: 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65  int n, int isPre
05d0: 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72  pareV2){.  asser
05e0: 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d  t( isPrepareV2==
05f0: 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32  1 || isPrepareV2
0600: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  ==0 );.  if( p==
0610: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
0620: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
0630: 52 41 43 45 0a 20 20 69 66 28 20 21 69 73 50 72  RACE.  if( !isPr
0640: 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72 6e  epareV2 ) return
0650: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
0660: 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b  t( p->zSql==0 );
0670: 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c  .  p->zSql = sql
0680: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
0690: 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d  >db, z, n);.  p-
06a0: 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 69  >isPrepareV2 = i
06b0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
06c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
06d0: 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77  SQL associated w
06e0: 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20 73  ith a prepared s
06f0: 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73  tatement.*/.cons
0700: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0710: 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sql(sqlite3_stmt
0720: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 56 64 62 65   *pStmt){.  Vdbe
0730: 20 2a 70 20 3d 20 28 56 64 62 65 20 2a 29 70 53   *p = (Vdbe *)pS
0740: 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  tmt;.  return (p
0750: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3f 20  ->isPrepareV2 ? 
0760: 70 2d 3e 7a 53 71 6c 20 3a 20 30 29 3b 0a 7d 0a  p->zSql : 0);.}.
0770: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0780: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0790: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
07a0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
07b0: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
07c0: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07d0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07e0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07f0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
0800: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
0810: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
0820: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0830: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0840: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0850: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0860: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0870: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0880: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0890: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
08a0: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
08b0: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
08c0: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08d0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08e0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08f0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
0900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0910: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  EBUG./*.** Turn 
0920: 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  tracing on or of
0930: 66 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  f.*/.void sqlite
0940: 33 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20  3VdbeTrace(Vdbe 
0950: 2a 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29  *p, FILE *trace)
0960: 7b 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74  {.  p->trace = t
0970: 72 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  race;.}.#endif..
0980: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
0990: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
09a0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
09b0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61   least one op la
09c0: 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74  rger than .** it
09d0: 20 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   was..**.** If a
09e0: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
09f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
0a00: 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20  le resizing the 
0a10: 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a  array, return.**
0a20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49   SQLITE_NOMEM. I
0a30: 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65  n this case Vdbe
0a40: 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f  .aOp and Vdbe.nO
0a50: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a60: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a70: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a80: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a90: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0aa0: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0ab0: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0ac0: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0ad0: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0ae0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0af0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 29  OpArray(Vdbe *p)
0b00: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77  {.  VdbeOp *pNew
0b10: 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28  ;.  int nNew = (
0b20: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
0b30: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69  >nOpAlloc*2 : (i
0b40: 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28  nt)(1024/sizeof(
0b50: 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op)));.  pNew = 
0b60: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0b70: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  (p->db, p->aOp, 
0b80: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0b90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0ba0: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0bb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0bc0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0bd0: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0be0: 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     p->aOp = pNew
0bf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0c00: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0c10: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
0c30: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0c40: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0c50: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0c60: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0c70: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
0c80: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0c90: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
0ca0: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
0cb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
0cd0: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
0ce0: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
0cf0: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
0d00: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
0d10: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
0d20: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
0d30: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
0d40: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0d50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0d60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0d70: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0d80: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0d90: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
0da0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0db0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0dc0: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
0dd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0de0: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
0df0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
0e00: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
0e10: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
0e20: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
0e30: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
0e40: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
0e50: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
0e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
0e70: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
0e80: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0e90: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
0ea0: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29  growOpArray(p) )
0eb0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
0ec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
0ed0: 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20  >nOp++;.  pOp = 
0ee0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f  &p->aOp[i];.  pO
0ef0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29  p->opcode = (u8)
0f00: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
0f10: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
0f20: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
0f30: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
0f40: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
0f50: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
0f60: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
0f70: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0f80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0f90: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
0fa0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
0fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
0fc0: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
0fd0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0fe0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0ff0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
1000: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
1010: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
1020: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1030: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
1040: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1050: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
1060: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
1070: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1080: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
1090: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
10a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
10b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
10c0: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
10d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
10f0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1100: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
1110: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1120: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1140: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1150: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1160: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1170: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1180: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1190: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
11a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11b0: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
11c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11d0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
11e0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
11f0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1200: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
1210: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1220: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1230: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1240: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1260: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1270: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1280: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1290: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
12a0: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
12b0: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
12c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
12d0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
12e0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
12f0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1310: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1320: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1330: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1340: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1350: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1360: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1370: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1380: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1390: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
13a0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
13b0: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
13c0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
13d0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
13e0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
13f0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
1400: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
1410: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1420: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1430: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1440: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1450: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1460: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1470: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1480: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1490: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
14a0: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
14b0: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
14c0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
14d0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
14e0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
14f0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
1500: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
1510: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1520: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1530: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1540: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1550: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1560: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1570: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1580: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1590: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
15a0: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
15b0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
15c0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
15d0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
15e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
15f0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
1600: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
1610: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1620: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1630: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1640: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
1650: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
1660: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e  .    int n = p->
1670: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
1680: 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  5;.    p->aLabel
1690: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
16a0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
16b0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61     n*sizeof(p->a
16f0: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  Label[0]));.    
1700: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d  p->nLabelAlloc =
1710: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1720: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Size(p->db, p->a
1730: 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d  Label)/sizeof(p-
1740: 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d  >aLabel[0]);.  }
1750: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1760: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1770: 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  l[i] = -1;.  }. 
1780: 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a   return -1-i;.}.
1790: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c  ./*.** Resolve l
17a0: 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74  abel "x" to be t
17b0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
17c0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
17d0: 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65  on to.** be inse
17e0: 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d  rted.  The param
17f0: 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61  eter "x" must ha
1800: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1810: 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72   from.** a prior
1820: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1830: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e  VdbeMakeLabel().
1840: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1850: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1860: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78 29  (Vdbe *p, int x)
1870: 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78  {.  int j = -1-x
1880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1890: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
18a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
18b0: 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e  t( j>=0 && j<p->
18c0: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20  nLabel );.  if( 
18d0: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
18e0: 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20   p->aLabel[j] = 
18f0: 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 23  p->nOp;.  }.}..#
1900: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1910: 55 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73  UG /* sqlite3Ass
1920: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f  ertMayAbort() lo
1930: 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  gic */../*.** Th
1940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
1950: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72   and function ar
1960: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
1970: 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  e through all op
1980: 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64  codes.** in a Vd
1990: 62 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  be main program 
19a0: 61 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20  and each of the 
19b0: 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72  sub-programs (tr
19c0: 69 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a  iggers) it may .
19d0: 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74  ** invoke direct
19e0: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
19f0: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75  . It should be u
1a00: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
1a10: 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b  **.**   Op *pOp;
1a20: 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72  .**   VdbeOpIter
1a30: 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20   sIter;.**.**   
1a40: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
1a50: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
1a60: 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d  ;.**   sIter.v =
1a70: 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   v;             
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a90: 2f 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56  / v is of type V
1aa0: 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65  dbe* .**   while
1ab0: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
1ac0: 65 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a  ext(&sIter)) ){.
1ad0: 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d  **     // Do som
1ae0: 65 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a  ething with pOp.
1af0: 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69  **   }.**   sqli
1b00: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
1b10: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a   sIter.apSub);.*
1b20: 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  * .*/.typedef st
1b30: 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20  ruct VdbeOpIter 
1b40: 56 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75  VdbeOpIter;.stru
1b50: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a  ct VdbeOpIter {.
1b60: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 56 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20  Vdbe to iterate 
1b90: 74 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f  through the opco
1ba0: 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50  des of */.  SubP
1bb0: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20  rogram **apSub; 
1bc0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1bd0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  of subprograms *
1be0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20  /.  int nSub;   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1c10: 69 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a  ies in apSub */.
1c20: 20 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20    int iAddr;    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c40: 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
1c50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72  instruction to r
1c60: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
1c70: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
1c80: 20 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69        /* 0 = mai
1c90: 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66  n program, 1 = f
1ca0: 69 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d  irst sub-program
1cb0: 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74   etc. */.};.stat
1cc0: 69 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78  ic Op *opIterNex
1cd0: 74 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29  t(VdbeOpIter *p)
1ce0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d  {.  Vdbe *v = p-
1cf0: 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d  >v;.  Op *pRet =
1d00: 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20   0;.  Op *aOp;. 
1d10: 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28   int nOp;..  if(
1d20: 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75   p->iSub<=p->nSu
1d30: 62 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d  b ){..    if( p-
1d40: 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >iSub==0 ){.    
1d50: 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a    aOp = v->aOp;.
1d60: 20 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e        nOp = v->n
1d70: 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Op;.    }else{. 
1d80: 20 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70       aOp = p->ap
1d90: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
1da0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d  aOp;.      nOp =
1db0: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
1dc0: 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b-1]->nOp;.    }
1dd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1de0: 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20  iAddr<nOp );..  
1df0: 20 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d    pRet = &aOp[p-
1e00: 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e  >iAddr];.    p->
1e10: 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28  iAddr++;.    if(
1e20: 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29   p->iAddr==nOp )
1e30: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b  {.      p->iSub+
1e40: 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64  +;.      p->iAdd
1e50: 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  r = 0;.    }.  .
1e60: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34      if( pRet->p4
1e70: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
1e80: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  RAM ){.      int
1e90: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75   nByte = (p->nSu
1ea0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
1eb0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
1ec0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
1ed0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b  (j=0; j<p->nSub;
1ee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1ef0: 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d  f( p->apSub[j]==
1f00: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
1f10: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
1f20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
1f30: 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20  p->nSub ){.     
1f40: 20 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71     p->apSub = sq
1f50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
1f60: 46 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61  Free(v->db, p->a
1f70: 70 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pSub, nByte);.  
1f80: 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70        if( !p->ap
1f90: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
1fa0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
1fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fc0: 20 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e      p->apSub[p->
1fd0: 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e  nSub++] = pRet->
1fe0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
1ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2000: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2010: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
2020: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70  * Check if the p
2030: 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e  rogram stored in
2040: 20 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74   the VM associat
2050: 65 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d  ed with pParse m
2060: 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41  ay.** throw an A
2070: 42 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28  BORT exception (
2080: 63 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74  causing the stat
2090: 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65  ement, but not e
20a0: 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
20b0: 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65  n.** to be rolle
20c0: 64 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f  d back). This co
20d0: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
20e0: 69 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  if the main prog
20f0: 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75  ram or any.** su
2100: 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61  b-programs conta
2110: 69 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66  ins any of the f
2120: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2130: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74    *  OP_Halt wit
2140: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2150: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2160: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2170: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69  OP_HaltIfNull wi
2180: 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e  th P1=SQLITE_CON
2190: 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f  STRAINT and P2=O
21a0: 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20  E_Abort..**   * 
21b0: 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20   OP_Destroy.**  
21c0: 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a   *  OP_VUpdate.*
21d0: 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d  *   *  OP_VRenam
21e0: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43  e.**   *  OP_FkC
21f0: 6f 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d  ounter with P2==
2200: 30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  0 (immediate for
2210: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2220: 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  int).**.** Then 
2230: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
2240: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
2250: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
2260: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
2270: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
2280: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2290: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
22a0: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
22b0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
22c0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
22d0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
22e0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
22f0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
2300: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
2310: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
2320: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
2330: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2340: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2350: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
2360: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
2370: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
2380: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
2390: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
23a0: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
23b0: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
23c0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  = 0;.  Op *pOp;.
23d0: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74    VdbeOpIter sIt
23e0: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49  er;.  memset(&sI
23f0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2400: 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e  Iter));.  sIter.
2410: 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28  v = v;..  while(
2420: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2430: 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29  xt(&sIter))!=0 )
2440: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65  {.    int opcode
2450: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
2460: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2470: 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70  OP_Destroy || op
2480: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65  code==OP_VUpdate
2490: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
24a0: 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64 65 66 20  Rename .#ifndef 
24b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
24c0: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20  IGN_KEY.     || 
24d0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f  (opcode==OP_FkCo
24e0: 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70 31  unter && pOp->p1
24f0: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d  ==0 && pOp->p2==
2500: 31 29 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  1) .#endif.     
2510: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
2520: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
2530: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
2540: 20 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70        && (pOp->p
2550: 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  1==SQLITE_CONSTR
2560: 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d  AINT && pOp->p2=
2570: 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20  =OE_Abort)).    
2580: 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72  ){.      hasAbor
2590: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  t = 1;.      bre
25a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
25b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
25c0: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
25d0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
25e0: 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72 74  true if hasAbort
25f0: 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69  ==mayAbort. Or i
2600: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
2610: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a  re occured..  **
2620: 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65   If malloc faile
2630: 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c  d, then the whil
2640: 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d  e() loop above m
2650: 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72  ay not have iter
2660: 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67  ated.  ** throug
2670: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e  h all opcodes an
2680: 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62  d hasAbort may b
2690: 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  e set incorrectl
26a0: 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74  y. Return.  ** t
26b0: 72 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73  rue for this cas
26c0: 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  e to prevent the
26d0: 20 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65   assert() in the
26e0: 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20   callers frame. 
26f0: 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67   ** from failing
2700: 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2710: 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   v->db->mallocFa
2720: 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74  iled || hasAbort
2730: 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a  ==mayAbort );.}.
2740: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2750: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
2760: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2770: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
2780: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72  ../*.** Loop thr
2790: 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d  ough the program
27a0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20   looking for P2 
27b0: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
27c0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a  negative.** on j
27d0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
27e0: 2e 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  .  Each such val
27f0: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
2800: 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c  Resolve the.** l
2810: 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20  abel by setting 
2820: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
2830: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
2840: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
2850: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2860: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
2870: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
2880: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
2890: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
28a0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
28b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
28c0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
28d0: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
28e0: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
28f0: 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65  ction, OP_AggSte
2900: 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20  p or OP_VFilter 
2910: 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  opcode. This is 
2920: 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69  used by .** sqli
2930: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
2940: 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56  () to size the V
2950: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
2960: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2970: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
2980: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
2990: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
29a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d   int i;.  int nM
29b0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
29c0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
29d0: 70 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c  p;.  int *aLabel
29e0: 20 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20   = p->aLabel;.  
29f0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  p->readOnly = 1;
2a00: 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f  .  for(pOp=p->aO
2a10: 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69  p, i=p->nOp-1; i
2a20: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29  >=0; i--, pOp++)
2a30: 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20  {.    u8 opcode 
2a40: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a  = pOp->opcode;..
2a50: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
2a60: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f  OP_Function || o
2a70: 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65  pcode==OP_AggSte
2a80: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  p ){.      if( p
2a90: 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20  Op->p5>nMaxArgs 
2aa0: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70  ) nMaxArgs = pOp
2ab0: 2d 3e 70 35 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->p5;.#ifndef SQ
2ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2ad0: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
2ae0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2af0: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
2b00: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
2b10: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2b20: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64   = pOp->p2;.#end
2b30: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
2b40: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e   opcode==OP_Tran
2b50: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2b60: 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  p2!=0 ){.      p
2b70: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
2b80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b90: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2ba0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2bb0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
2bc0: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
2bd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2be0: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
2bf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2c00: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
2c10: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
2c20: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
2c30: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
2c40: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
2c50: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
2c60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2c70: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64  sqlite3VdbeOpcod
2c80: 65 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63  eHasProperty(opc
2c90: 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  ode, OPFLG_JUMP)
2ca0: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b   && pOp->p2<0 ){
2cb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d  .      assert( -
2cc0: 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61  1-pOp->p2<p->nLa
2cd0: 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  bel );.      pOp
2ce0: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
2cf0: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d  -pOp->p2];.    }
2d00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
2d10: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
2d20: 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61  Label);.  p->aLa
2d30: 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61  bel = 0;..  *pMa
2d40: 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78  xFuncArgs = nMax
2d50: 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Args;.}../*.** R
2d60: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
2d70: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2d80: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2d90: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
2da0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2db0: 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29  entAddr(Vdbe *p)
2dc0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
2dd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2de0: 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72  _INIT );.  retur
2df0: 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  n p->nOp;.}../*.
2e00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e10: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2e20: 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20  er to the array 
2e30: 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63  of opcodes assoc
2e40: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
2e50: 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
2e60: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
2e70: 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63  ent. It is the c
2e80: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
2e90: 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61  ility.** to arra
2ea0: 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  nge for the retu
2eb0: 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65  rned array to be
2ec0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
2ed0: 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20  d using the .** 
2ee0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
2ef0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ) function..**.*
2f00: 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
2f10: 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74  ng, *pnOp is set
2f20: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
2f30: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
2f40: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72   returned.** arr
2f50: 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78  ay. Also, *pnMax
2f60: 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  Arg is set to th
2f70: 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20  e larger of its 
2f80: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
2f90: 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  d .** the number
2fa0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
2fb0: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
2fc0: 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74  array required t
2fd0: 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a  o execute the .*
2fe0: 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72  * returned progr
2ff0: 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  am..*/.VdbeOp *s
3000: 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70  qlite3VdbeTakeOp
3010: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
3020: 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70  nt *pnOp, int *p
3030: 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65  nMaxArg){.  Vdbe
3040: 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *aOp = p->aOp
3050: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20  ;.  assert( aOp 
3060: 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  && !p->db->mallo
3070: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a  cFailed );..  /*
3080: 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69   Check that sqli
3090: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
30a0: 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
30b0: 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a  d on this VM */.
30c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 75    assert( p->aMu
30d0: 74 65 78 2e 6e 4d 75 74 65 78 3d 3d 30 20 29 3b  tex.nMutex==0 );
30e0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
30f0: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
3100: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
3110: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
3120: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
3130: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
3140: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
3150: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
3160: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
3170: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
3180: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
3190: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
31a0: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
31b0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
31c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
31d0: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
31e0: 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74  nst *aOp){.  int
31f0: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
3200: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3210: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3220: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
3230: 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26   > p->nOpAlloc &
3240: 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29  & growOpArray(p)
3250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3260: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
3270: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57  ->nOp;.  if( ALW
3280: 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20  AYS(nOp>0) ){.  
3290: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
32a0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
32b0: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
32c0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
32d0: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
32e0: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
32f0: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
3300: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
3310: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
3320: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
3330: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
3340: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
3350: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
3360: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
3370: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
3380: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
3390: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
33a0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
33b0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
33c0: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
33d0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
33e0: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
33f0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3400: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3410: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3420: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3430: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3440: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3450: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3460: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
3470: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
3480: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
3490: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
34a0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
34b0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
34c0: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
34d0: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
34e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34f0: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
3500: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
3510: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
3520: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
3530: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
3540: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
3550: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
3560: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
3570: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
3580: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
3590: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
35a0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
35b0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
35c0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
35d0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
35e0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
35f0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
3600: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
3610: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3620: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
3630: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
3640: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3650: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
3660: 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  r>=0 );.  if( p-
3670: 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20  >nOp>addr ){.   
3680: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
3690: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
36a0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
36b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
36c0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
36d0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
36e0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
36f0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3700: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3710: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3720: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3730: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3740: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
3750: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3760: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
3770: 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20  t( addr>=0 );.  
3780: 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20  if( p->nOp>addr 
3790: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
37a0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
37b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
37c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
37d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
37e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
37f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
3800: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
3810: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
3820: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
3830: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
3840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
3850: 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ddr>=0 );.  if( 
3860: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20  p->nOp>addr ){. 
3870: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
3880: 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p3 = val;.  }.}.
3890: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
38a0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
38b0: 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68  5 operand for th
38c0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a  e most recently.
38d0: 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69  ** added operati
38e0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
38f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
3900: 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29  Vdbe *p, u8 val)
3910: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3920: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
3930: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3940: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
3950: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3960: 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p5 = val;.  }.}
3970: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3980: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66  he P2 operand of
3990: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
39a0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
39b0: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64  nts to.** the ad
39c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
39d0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
39e0: 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f   be coded..*/.vo
39f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  id sqlite3VdbeJu
3a00: 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20  mpHere(Vdbe *p, 
3a10: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c  int addr){.  sql
3a20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
3a30: 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70  (p, addr, p->nOp
3a40: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  );.}.../*.** If 
3a50: 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65  the input FuncDe
3a60: 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  f structure is e
3a70: 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66  phemeral, then f
3a80: 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  ree it.  If.** t
3a90: 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f  he FuncDef is no
3aa0: 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e  t ephermal, then
3ab0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a   do nothing..*/.
3ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
3ad0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
3ae0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  n(sqlite3 *db, F
3af0: 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20  uncDef *pDef){. 
3b00: 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66   if( ALWAYS(pDef
3b10: 29 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  ) && (pDef->flag
3b20: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
3b30: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
3b40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3b50: 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a  b, pDef);.  }.}.
3b60: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
3b70: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
3b80: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
3b90: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
3ba0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
3bb0: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
3bc0: 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20  .  if( p4 ){.   
3bd0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
3be0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
3bf0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
3c00: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
3c10: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
3c20: 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  F:.      case P4
3c30: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
3c40: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
3c50: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
3c60: 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63  NTARRAY:.      c
3c70: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ase P4_KEYINFO_H
3c80: 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20  ANDOFF: {.      
3c90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3ca0: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
3cb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3cc0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44        case P4_VD
3cd0: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
3ce0: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
3cf0: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
3d00: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
3d10: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
3d20: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
3d30: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
3d40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3d50: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56  DeleteAuxData(pV
3d60: 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20  dbeFunc, 0);.   
3d70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3d80: 65 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63  ee(db, pVdbeFunc
3d90: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3db0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
3dc0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
3dd0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
3de0: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
3df0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
3e00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3e10: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
3e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3e30: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
3e40: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
3e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3e60: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3e70: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
3e80: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 55      sqlite3VtabU
3e90: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
3ea0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3eb0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3ec0: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
3ed0: 47 52 41 4d 20 3a 20 7b 0a 20 20 20 20 20 20 20  GRAM : {.       
3ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 6f 67   sqlite3VdbeProg
3ef0: 72 61 6d 44 65 6c 65 74 65 28 64 62 2c 20 28 53  ramDelete(db, (S
3f00: 75 62 50 72 6f 67 72 61 6d 20 2a 29 70 34 2c 20  ubProgram *)p4, 
3f10: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
3f20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
3f40: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
3f50: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
3f60: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
3f70: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
3f80: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
3f90: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
3fa0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
3fb0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
3fc0: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
3fd0: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
3fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
3ff0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
4000: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
4010: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
4020: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
4030: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
4040: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
4050: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
4060: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
4070: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
4080: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
4090: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
40a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
40b0: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
40c0: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
40d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
40e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
40f0: 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  Op);.}../*.** De
4100: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d  crement the ref-
4110: 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 53 75 62  count on the Sub
4120: 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
4130: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
4140: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
4150: 6e 74 2e 20 49 66 20 74 68 65 20 72 65 66 2d 63  nt. If the ref-c
4160: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
4170: 6f 2c 20 66 72 65 65 20 74 68 65 20 73 74 72 75  o, free the stru
4180: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cture..**.** The
4190: 20 61 72 72 61 79 20 6f 66 20 56 44 42 45 20 6f   array of VDBE o
41a0: 70 63 6f 64 65 73 20 73 74 6f 72 65 64 20 61 73  pcodes stored as
41b0: 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 20   SubProgram.aOp 
41c0: 69 73 20 66 72 65 65 64 20 69 66 0a 2a 2a 20 65  is freed if.** e
41d0: 69 74 68 65 72 20 74 68 65 20 72 65 66 2d 63 6f  ither the ref-co
41e0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
41f0: 20 6f 72 20 70 61 72 61 6d 65 74 65 72 20 66 72   or parameter fr
4200: 65 65 6f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eeop is non-zero
4210: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ..**.** Since th
4220: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
4230: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  es pointed to by
4240: 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 20   SubProgram.aOp 
4250: 6d 61 79 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  may directly.** 
4260: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 20 63 6f  or indirectly co
4270: 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  ntain a referenc
4280: 65 20 74 6f 20 74 68 65 20 53 75 62 50 72 6f 67  e to the SubProg
4290: 72 61 6d 20 73 74 72 75 63 74 75 72 65 20 69 74  ram structure it
42a0: 73 65 6c 66 2e 0a 2a 2a 20 42 79 20 70 61 73 73  self..** By pass
42b0: 69 6e 67 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 66  ing a non-zero f
42c0: 72 65 65 6f 70 20 70 61 72 61 6d 65 74 65 72 2c  reeop parameter,
42d0: 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 20   the caller may 
42e0: 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 0a  ensure that all.
42f0: 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20 73 74  ** SubProgram st
4300: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
4310: 69 72 20 61 4f 70 20 61 72 72 61 79 73 20 61 72  ir aOp arrays ar
4320: 65 20 66 72 65 65 64 2c 20 65 76 65 6e 20 77 68  e freed, even wh
4330: 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
4340: 73 75 63 68 20 63 69 72 63 75 6c 61 72 20 72 65  such circular re
4350: 66 65 72 65 6e 63 65 73 2e 0a 2a 2f 0a 76 6f 69  ferences..*/.voi
4360: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 6f  d sqlite3VdbePro
4370: 67 72 61 6d 44 65 6c 65 74 65 28 73 71 6c 69 74  gramDelete(sqlit
4380: 65 33 20 2a 64 62 2c 20 53 75 62 50 72 6f 67 72  e3 *db, SubProgr
4390: 61 6d 20 2a 70 2c 20 69 6e 74 20 66 72 65 65 6f  am *p, int freeo
43a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
43b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
43c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ef>0 );.    if( 
43d0: 66 72 65 65 6f 70 20 7c 7c 20 70 2d 3e 6e 52 65  freeop || p->nRe
43e0: 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 4f 70  f==1 ){.      Op
43f0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
4400: 20 20 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 30        p->aOp = 0
4410: 3b 0a 20 20 20 20 20 20 76 64 62 65 46 72 65 65  ;.      vdbeFree
4420: 4f 70 41 72 72 61 79 28 64 62 2c 20 61 4f 70 2c  OpArray(db, aOp,
4430: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 20 20   p->nOp);.      
4440: 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 20 20  p->nOp = 0;.    
4450: 7d 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  }.    p->nRef--;
4460: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
4470: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4480: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
44a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
44b0: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
44c0: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
44d0: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
44e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
44f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
4500: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
4510: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4520: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
4530: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
4540: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4550: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69  = p->db;.    whi
4560: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
4570: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4580: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4590: 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  .p);.      memse
45a0: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
45b0: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
45c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
45d0: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
45e0: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
45f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4600: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4610: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
4620: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4630: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
4640: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
4650: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
4660: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
4670: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
4680: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
4690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
46a0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
46b0: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
46c0: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
46d0: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
46e0: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
46f0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
4700: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
4710: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
4720: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
4730: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
4740: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4750: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
4760: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
4770: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
4780: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
4790: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
47a0: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
47b0: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
47c0: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
47d0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
47e0: 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45  *.** If n==P4_KE
47f0: 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74  YINFO it means t
4800: 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69  hat zP4 is a poi
4810: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
4820: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  o structure..** 
4830: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
4840: 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  f the KeyInfo st
4850: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d  ructure into mem
4860: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4870: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
4880: 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64  loc, to be freed
4890: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
48a0: 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  s finalized..** 
48b0: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
48c0: 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20  NDOFF indicates 
48d0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20  that zP4 points 
48e0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
48f0: 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64  ucture.** stored
4900: 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   in memory that 
4910: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
4920: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4930: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65  ite3_malloc. The
4940: 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75   .** caller shou
4950: 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20  ld not free the 
4960: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77  allocation, it w
4970: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65  ill be freed whe
4980: 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a  n the Vdbe is.**
4990: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a   finalized..** .
49a0: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
49b0: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
49c0: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
49d0: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
49e0: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
49f0: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
4a00: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
4a10: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
4a20: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
4a30: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
4a40: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
4a50: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
4a60: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
4a70: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
4a80: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
4a90: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
4aa0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
4ab0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4ac0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4ad0: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
4ae0: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
4af0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
4b00: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
4b10: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
4b20: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4b30: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
4b40: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4b50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4b60: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
4b70: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
4b80: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
4b90: 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46  f ( n!=P4_KEYINF
4ba0: 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20  O && n!=P4_VTAB 
4bb0: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  ) {.      freeP4
4bc0: 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a  (db, n, (void*)*
4bd0: 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20  (char**)&zP4);. 
4be0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b     }.    return;
4bf0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4c00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
4c10: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
4c20: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
4c30: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
4c40: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
4c50: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
4c60: 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64  ddr];.  freeP4(d
4c70: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
4c80: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f  pOp->p4.p);.  pO
4c90: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69  p->p4.p = 0;.  i
4ca0: 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29  f( n==P4_INT32 )
4cb0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74  {.    /* Note: t
4cc0: 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65  his cast is safe
4cd0: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72  , because the or
4ce0: 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20  igin data point 
4cf0: 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a  was an int.    *
4d00: 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20  * that was cast 
4d10: 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72  to a (const char
4d20: 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d   *). */.    pOp-
4d30: 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50  >p4.i = SQLITE_P
4d40: 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a  TR_TO_INT(zP4);.
4d50: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
4d60: 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65  = P4_INT32;.  }e
4d70: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
4d80: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
4d90: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
4da0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
4db0: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
4dc0: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
4dd0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
4de0: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e  yInfo;.    int n
4df0: 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20  Field, nByte;.. 
4e00: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
4e10: 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69  yInfo*)zP4)->nFi
4e20: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
4e30: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
4e40: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
4e50: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
4e60: 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69  >aColl[0]) + nFi
4e70: 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  eld;.    pKeyInf
4e80: 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o = sqlite3Mallo
4e90: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
4ea0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
4eb0: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
4ec0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
4ed0: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
4ee0: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
4ef0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
4f00: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
4f10: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
4f20: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4f30: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
4f40: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
4f50: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
4f60: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
4f70: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
4f80: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
4f90: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
4fa0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
4fb0: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
4fc0: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
4fd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
4fe0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
4ff0: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
5000: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
5010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
5020: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
5030: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
5040: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
5050: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
5060: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
5070: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5080: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
5090: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
50a0: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
50b0: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
50c0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
50d0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
50e0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
50f0: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
5100: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
5110: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
5120: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
5130: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
5140: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
5150: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
5160: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5170: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5180: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
5190: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
51a0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
51b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
51c0: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
51d0: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
51e0: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
51f0: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
5200: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
5210: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  NAMIC;.  }.}..#i
5220: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
5230: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f  ** Change the co
5240: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65  mment on the the
5250: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
5260: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
5270: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20  .  Or.** insert 
5280: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20  a No-op and add 
5290: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74  the comment to t
52a0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74  hat new instruct
52b0: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61  ion.  This.** ma
52c0: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73  kes the code eas
52d0: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69  ier to read duri
52e0: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e  ng debugging.  N
52f0: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70  one of this happ
5300: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64  ens.** in a prod
5310: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f  uction build..*/
5320: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5330: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
5340: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
5350: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
5360: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
5370: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
5380: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
5390: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
53a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
53b0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
53c0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
53d0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
53e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
53f0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
5400: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26     char **pz = &
5410: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5420: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76  .zComment;.    v
5430: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5440: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mat);.    sqlite
5450: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a  3DbFree(p->db, *
5460: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
5470: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5480: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5490: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
54a0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
54b0: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
54c0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
54d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
54e0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
54f0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70  ist ap;.  if( !p
5500: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
5510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5520: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73  , OP_Noop);.  as
5530: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
5540: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
5550: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
5560: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
5570: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
5580: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5590: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
55a0: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
55b0: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
55c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
55d0: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
55e0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
55f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
5600: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
5610: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
5620: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5630: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
5640: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
5650: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
5660: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
5670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
5680: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
5690: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
56a0: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
56b0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
56c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
56d0: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
56e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
56f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5700: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5710: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5720: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5730: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
5740: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5750: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
5760: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
5770: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
5780: 69 73 20 72 65 61 64 61 62 6c 65 20 61 6e 64 20  is readable and 
5790: 77 72 69 74 61 62 6c 65 2c 20 62 75 74 20 69 74  writable, but it
57a0: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 2e 20   has no effect. 
57b0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
57c0: 20 64 75 6d 6d 79 0a 2a 2a 20 6f 70 63 6f 64 65   dummy.** opcode
57d0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
57e0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
57f0: 63 74 69 6f 6e 69 6e 67 20 61 66 74 65 72 20 61  ctioning after a
5800: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
5810: 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20  ut.** having to 
5820: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
5830: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
5840: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5850: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
5860: 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65  .**.** About the
5870: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
5880: 4d 49 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d  MIT_TRACE:  Norm
5890: 61 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69  ally, this routi
58a0: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
58b0: 65 64 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e  ed.** unless p->
58c0: 6e 4f 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20  nOp>0.  This is 
58d0: 62 65 63 61 75 73 65 20 69 6e 20 74 68 65 20 61  because in the a
58e0: 62 73 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45  bsense of SQLITE
58f0: 5f 4f 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20  _OMIT_TRACE,.** 
5900: 61 6e 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74  an OP_Trace inst
5910: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ruction is alway
5920: 73 20 69 6e 73 65 72 74 65 64 20 62 79 20 73 71  s inserted by sq
5930: 6c 69 74 65 33 56 64 62 65 47 65 74 28 29 20 61  lite3VdbeGet() a
5940: 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e  s soon as.** a n
5950: 65 77 20 56 44 42 45 20 69 73 20 63 72 65 61 74  ew VDBE is creat
5960: 65 64 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66  ed.  So we are f
5970: 72 65 65 20 74 6f 20 73 65 74 20 61 64 64 72 20  ree to set addr 
5980: 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68  to p->nOp-1 with
5990: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f  out.** having to
59a0: 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f   double-check to
59b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
59c0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f  the result is no
59d0: 6e 2d 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a  n-negative. But.
59e0: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** if SQLITE_OMI
59f0: 54 5f 54 52 41 43 45 20 69 73 20 64 65 66 69 6e  T_TRACE is defin
5a00: 65 64 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65  ed, the OP_Trace
5a10: 20 69 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20   is omitted and 
5a20: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a  we do need to.**
5a30: 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   check the value
5a40: 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66   of p->nOp-1 bef
5a50: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a  ore continuing..
5a60: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
5a70: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
5a80: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
5a90: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
5aa0: 64 75 6d 6d 79 3b 0a 20 20 61 73 73 65 72 74 28  dummy;.  assert(
5ab0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5ac0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5ad0: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69  if( addr<0 ){.#i
5ae0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5af0: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
5b00: 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72  ->nOp==0 ) retur
5b10: 6e 20 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66  n &dummy;.#endif
5b20: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
5b30: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
5b40: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
5b50: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
5b60: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
5b70: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
5b80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5b90: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
5ba0: 20 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65   &dummy;.  }else
5bb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d  {.    return &p-
5bc0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a  >aOp[addr];.  }.
5bd0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
5be0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
5bf0: 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AIN) || !defined
5c00: 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20  (NDEBUG) \.     
5c10: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
5c20: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
5c30: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5c40: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
5c50: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
5c60: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
5c70: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
5c80: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
5c90: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
5ca0: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
5cb0: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
5cc0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
5cd0: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
5ce0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
5cf0: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
5d00: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
5d10: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
5d20: 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  20 );.  switch( 
5d30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
5d40: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
5d50: 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63  FO_STATIC:.    c
5d60: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
5d70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
5d80: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
5d90: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
5da0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
5db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5dc0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
5dd0: 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c  p, "keyinfo(%d",
5de0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
5df0: 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71  d);.      i = sq
5e00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
5e10: 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  emp);.      for(
5e20: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d  j=0; j<pKeyInfo-
5e30: 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20  >nField; j++){. 
5e40: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
5e50: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
5e60: 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  ->aColl[j];.    
5e70: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
5e80: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
5e90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
5ea0: 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  30(pColl->zName)
5eb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5ec0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
5ee0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
5ef0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
5f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5f20: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27  zTemp[i++] = ','
5f30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5f40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5f50: 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f  rder && pKeyInfo
5f60: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
5f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
5f80: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
5f90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5fa0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
5fb0: 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e  Temp[i], pColl->
5fc0: 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20  zName,n+1);.    
5fd0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
5fe0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5ff0: 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+4<nTemp-6 ){. 
6000: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6010: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22  &zTemp[i],",nil"
6020: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,4);.          i
6030: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
6040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
6050: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
6060: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
6070: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
6080: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
6090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
60a0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
60b0: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
60c0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
60d0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
60e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
60f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6100: 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30  p, "collseq(%.20
6110: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
6120: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
6130: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6140: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
6150: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
6160: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
6170: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
6180: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6190: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
61a0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
61b0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
61c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
61d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
61e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
61f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6200: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
6210: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
6220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6230: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6240: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
6250: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6260: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6270: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
6280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6290: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
62a0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
62b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
62c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
62d0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
62e0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
62f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6300: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
6310: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
6320: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
6330: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
6340: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
6350: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  l)==0 );.      i
6360: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
6370: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
6380: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
6390: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
63a0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
63b0: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
63c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
63d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
63e0: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
63f0: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
6400: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
6410: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
6420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6430: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6440: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
6450: 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20   pMem->r);.     
6460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6470: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
6480: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
6490: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
64a0: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
64b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
64c0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
64d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
64e0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
64f0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
6500: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
6510: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
6520: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
6530: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6540: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6550: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
6560: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
6570: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
6580: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6590: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
65a0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
65b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
65c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
65d0: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
65e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65f0: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
6600: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
6610: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6620: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
6630: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
6640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6650: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6660: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
6670: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
6680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
6690: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
66a0: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
66b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
66c0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34   }.  assert( zP4
66d0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
66e0: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  zP4;.}.#endif../
66f0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20  *.** Declare to 
6700: 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68  the Vdbe that th
6710: 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61  e BTree object a
6720: 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20  t db->aDb[i] is 
6730: 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
6740: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6750: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
6760: 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  i){.  int mask;.
6770: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
6780: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
6790: 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29 2a  & i<sizeof(u32)*
67a0: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
67b0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
67c0: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
67d0: 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29 31    mask = ((u32)1
67e0: 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e  )<<i;.  if( (p->
67f0: 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b  btreeMask & mask
6800: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62  )==0 ){.    p->b
6810: 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  treeMask |= mask
6820: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
6830: 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65  eeMutexArrayInse
6840: 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70  rt(&p->aMutex, p
6850: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
6860: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64  );.  }.}...#if d
6870: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
6880: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
6890: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
68a0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
68b0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
68c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
68d0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
68e0: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
68f0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
6900: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
6910: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
6920: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
6930: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74  r zPtr[50];.  st
6940: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6950: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
6960: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
6970: 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c  4d %-4s %.2X %s\
6980: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
6990: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
69a0: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
69b0: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
69c0: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20  sizeof(zPtr));. 
69d0: 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a   fprintf(pOut, z
69e0: 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20  Format1, pc, .  
69f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64      sqlite3Opcod
6a00: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6a10: 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  e), pOp->p1, pOp
6a20: 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a  ->p2, pOp->p3, z
6a30: 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66  P4, pOp->p5,.#if
6a40: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6a50: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d  .      pOp->zCom
6a60: 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d  ment ? pOp->zCom
6a70: 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a  ment : "".#else.
6a80: 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a        "".#endif.
6a90: 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f    );.  fflush(pO
6aa0: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
6ab0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
6ac0: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
6ad0: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
6ae0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
6af0: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
6b00: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
6b10: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
6b20: 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  pEnd;.    sqlite
6b30: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
6b40: 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69     u8 malloc_fai
6b50: 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
6b60: 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f 72 28  Failed;.    for(
6b70: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
6b80: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
6b90: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
6ba0: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
6bb0: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20  ==p[1].db );..  
6bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
6bd0: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
6be0: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
6bf0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
6c00: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
6c10: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
6c20: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
6c30: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
6c40: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
6c50: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
6c60: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
6c70: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
6c80: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
6c90: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
6ca0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
6cb0: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
6cc0: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
6cd0: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
6ce0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
6cf0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
6d00: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
6d10: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
6d20: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
6d30: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
6d40: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
6d50: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
6d60: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
6d70: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
6d80: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
6d90: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
6da0: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
6db0: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
6dc0: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
6dd0: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
6de0: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
6df0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
6e00: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
6e10: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
6e20: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
6e30: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
6e40: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
6e50: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
6e60: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
6e70: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
6e80: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
6e90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
6ea0: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
6eb0: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
6ec0: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
6ed0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6ee0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
6ef0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
6f00: 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20   if( p->zMalloc 
6f10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6f20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6f30: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
6f40: 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30    p->zMalloc = 0
6f50: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6f60: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
6f70: 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Null;.    }.    
6f80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6f90: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
6fa0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
6fb0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
6fc0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
6fd0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
6fe0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
6ff0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
7000: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
7010: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
7020: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
7030: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7040: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
7050: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
7060: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
7070: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
7080: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
7090: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
70a0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
70b0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
70c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
70d0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
70e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
70f0: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
7100: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
7110: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
7120: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
7130: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
7140: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
7150: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
7160: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7170: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
7180: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
7190: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
71a0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
71b0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
71c0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
71d0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
71e0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
71f0: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
7200: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
7210: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
7220: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
7230: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
7240: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
7250: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
7260: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
7270: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
7280: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
7290: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
72a0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
72b0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
72c0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
72d0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
72e0: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
72f0: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
7300: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
7310: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
7320: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
7330: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
7340: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e  UERY PLAN..*/.in
7350: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
7360: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7380: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
7390: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
73c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
73d0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
73e0: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7410: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
7420: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
7430: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
7440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
7450: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
7460: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
7470: 2a 70 53 75 62 20 3d 20 30 3b 0a 20 20 73 71 6c  *pSub = 0;.  sql
7480: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7490: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
74a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
74b0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
74c0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
74d0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61  p->aMem[1];..  a
74e0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
74f0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
7500: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
7510: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
7520: 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  ert( db->magic==
7530: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
7540: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
7550: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
7560: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
7570: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
7580: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
7590: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
75a0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
75b0: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
75c0: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
75d0: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
75e0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
75f0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
7600: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
7610: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
7620: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
7630: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
7640: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
7650: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
7660: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
7670: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 0a 20 20  ay(pMem, 8);..  
7680: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
7690: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
76a0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
76b0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
76c0: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
76d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
76e0: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
76f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7700: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
7710: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
7720: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
7730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7740: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ROR;.  }..  /* F
7750: 69 67 75 72 65 20 6f 75 74 20 74 6f 74 61 6c 20  igure out total 
7760: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
7770: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
7780: 72 6e 65 64 20 62 79 20 74 68 69 73 20 0a 20 20  rned by this .  
7790: 2a 2a 20 45 58 50 4c 41 49 4e 20 70 72 6f 67 72  ** EXPLAIN progr
77a0: 61 6d 2e 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  am.  */.  nRow =
77b0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
77c0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
77d0: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
77e0: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
77f0: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
7800: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 6e 53  Blob ){.      nS
7810: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
7820: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
7830: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
7840: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
7850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7860: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
7870: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
7880: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
7890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
78a0: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
78b0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
78c0: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
78d0: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
78e0: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
78f0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
7900: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
7910: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7920: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
7930: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
7940: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
7950: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
7960: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
7970: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
7980: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
7990: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
79a0: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
79b0: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
79c0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
79d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
79e0: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
79f0: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
7a00: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 4f  >nOp ){.      pO
7a10: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
7a20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
7a40: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
7a50: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
7a60: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
7a70: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
7a80: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
7a90: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
7aa0: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
7ab0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
7ac0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
7ad0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
7ae0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
7af0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
7b00: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
7b10: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ER;.      pMem->
7b20: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
7b50: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
7b60: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
7b70: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
7b80: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
7b90: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
7ba0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
7bb0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
7bc0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
7bd0: 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64  code);  /* Opcod
7be0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
7bf0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
7c00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
7c10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7c20: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
7c30: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
7c40: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
7c50: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
7c60: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
7c70: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 69  pMem++;..      i
7c80: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
7c90: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
7ca0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
7cb0: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
7cc0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
7cd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
7ce0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
7cf0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
7d00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
7d10: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
7d20: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
7d30: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7d40: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
7d50: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
7d60: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
7d70: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
7d80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
7d90: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
7da0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
7db0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
7dc0: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
7dd0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
7de0: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
7df0: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
7e00: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
7e10: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
7e20: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
7e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7e40: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
7e50: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
7e60: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
7e70: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
7ea0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
7eb0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
7ec0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
7ed0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
7ee0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
7ef0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
7f20: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
7f30: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
7f40: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
7f50: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
7f60: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
7f70: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7f80: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
7f90: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
7fc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
7fd0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
7fe0: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  R;.      pMem++;
7ff0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
8000: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
8010: 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20  ow(pMem, 32, 0) 
8020: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){            /*
8030: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
8040: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
8050: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8060: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8070: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8080: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
8090: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
80a0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
80b0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
80c0: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
80d0: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
80e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
80f0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
8100: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
8110: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
8120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8130: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
8140: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
8150: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
8160: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
8170: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
8180: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
8190: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70   }.    pMem->typ
81a0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
81b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
81c0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
81d0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
81e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
81f0: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
8200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8210: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
8220: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8240: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
8250: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
8260: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
8270: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8280: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
8290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
82a0: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
82b0: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
82c0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
82d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
82e0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
82f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8300: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8310: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
8320: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8330: 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f  BUG.      if( pO
8340: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
8350: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
8360: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
8370: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
8380: 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43  Mem->z = pOp->zC
8390: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  omment;.        
83a0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
83b0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
83c0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
83d0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
83e0: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  TF8;.        pMe
83f0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
8400: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _TEXT;.      }el
8410: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
8420: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
8430: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
8440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8450: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
8460: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  nt */.        pM
8470: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8480: 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_NULL;.      }.
8490: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
84a0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35  esColumn = 8 - 5
84b0: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
84c0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
84d0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
84e0: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
84f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8500: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8510: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
8520: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8530: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
8540: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
8550: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
8560: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
8570: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
8580: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
8590: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
85a0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
85b0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
85c0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
85d0: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
85e0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
85f0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
8600: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
8610: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
8620: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
8630: 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  4.z;.    while( 
8640: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
8650: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72  z) ) z++;.    pr
8660: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
8670: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
8680: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
8690: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
86a0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
86b0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
86c0: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
86d0: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
86e0: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
86f0: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
8700: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
8710: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
8720: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
8730: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
8740: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
8750: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
8760: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
8770: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
8780: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
8790: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
87a0: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26  code==OP_Trace &
87b0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
87c0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
87d0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
87e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
87f0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
8800: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
8810: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
8820: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
8830: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
8840: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
8850: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
8860: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
8870: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
8880: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
8890: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
88a0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
88b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
88c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
88d0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
88e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
88f0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
8900: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
8910: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
8920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
8930: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
8940: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
8950: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
8960: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
8970: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
8980: 7a 65 20 62 75 66 66 65 72 2e 20 20 4d 61 6b 65  ze buffer.  Make
8990: 20 2a 70 70 20 70 6f 69 6e 74 20 74 6f 20 74 68   *pp point to th
89a0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 73  e.** allocated s
89b0: 70 61 63 65 2e 20 20 28 4e 6f 74 65 3a 20 20 70  pace.  (Note:  p
89c0: 70 20 69 73 20 61 20 63 68 61 72 2a 20 72 61 74  p is a char* rat
89d0: 68 65 72 20 74 68 61 6e 20 61 20 76 6f 69 64 2a  her than a void*
89e0: 2a 20 74 6f 0a 2a 2a 20 77 6f 72 6b 20 61 72 6f  * to.** work aro
89f0: 75 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  und the pointer 
8a00: 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 20 6f  aliasing rules o
8a10: 66 20 43 2e 29 20 20 2a 70 70 20 73 68 6f 75 6c  f C.)  *pp shoul
8a20: 64 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a 20 62  d initially.** b
8a30: 65 20 7a 65 72 6f 2e 20 20 49 66 20 2a 70 70 20  e zero.  If *pp 
8a40: 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 61  is not zero, tha
8a50: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
8a60: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
8a70: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
8a80: 61 74 65 64 20 61 6e 64 20 74 68 69 73 20 72 6f  ated and this ro
8a90: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 6f 70 2e  utine is a noop.
8aa0: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
8ab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8ac0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
8ad0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
8ae0: 6f 6d 20 70 6f 69 6e 74 20 74 6f 20 61 76 61 69  om point to avai
8af0: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
8b00: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
8b10: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
8b20: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
8b30: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
8b40: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
8b50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8b60: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
8b70: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
8b80: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
8b90: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
8ba0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
8bb0: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
8bc0: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
8bd0: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
8be0: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
8bf0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
8c00: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
8c10: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 53 70 61  ic void allocSpa
8c20: 63 65 28 0a 20 20 63 68 61 72 20 2a 70 70 2c 20  ce(.  char *pp, 
8c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
8c40: 2f 4f 55 54 3a 20 53 65 74 20 2a 70 70 20 74 6f  /OUT: Set *pp to
8c50: 20 70 6f 69 6e 74 20 74 6f 20 61 6c 6c 6f 63 61   point to alloca
8c60: 74 65 64 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ted buffer */.  
8c70: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
8c80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8c90: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
8ca0: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ate */.  u8 **pp
8cb0: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a  From,         /*
8cc0: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   IN/OUT: Allocat
8cd0: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a  e from *ppFrom *
8ce0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20  /.  u8 *pEnd,   
8cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8d00: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61  ter to 1 byte pa
8d10: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70  st the end of *p
8d20: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a  pFrom buffer */.
8d30: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20    int *pnByte   
8d40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
8d50: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
8d60: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
8d70: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
8d80: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
8d90: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a  BYTE_ALIGNMENT(*
8da0: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  ppFrom) );.  if(
8db0: 20 28 2a 28 76 6f 69 64 2a 2a 29 70 70 29 3d 3d   (*(void**)pp)==
8dc0: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
8dd0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
8de0: 20 20 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f      if( &(*ppFro
8df0: 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e  m)[nByte] <= pEn
8e00: 64 20 29 7b 0a 20 20 20 20 20 20 2a 28 76 6f 69  d ){.      *(voi
8e10: 64 2a 2a 29 70 70 20 3d 20 28 76 6f 69 64 20 2a  d**)pp = (void *
8e20: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 20 20  )*ppFrom;.      
8e30: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65  *ppFrom += nByte
8e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8e50: 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42     *pnByte += nB
8e60: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  yte;.    }.  }.}
8e70: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
8e80: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
8e90: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e  e for execution.
8ea0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
8eb0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
8ec0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61  s allocating sta
8ed0: 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69  ck space and ini
8ee0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72  tializing the pr
8ef0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a  ogram counter..*
8f00: 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45  * After the VDBE
8f10: 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c   has be prepped,
8f20: 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75   it can be execu
8f30: 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f  ted by one or mo
8f40: 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  re.** calls to s
8f50: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
8f60: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  .  .**.** This i
8f70: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
8f80: 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72  o move a VDBE fr
8f90: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  om VDBE_MAGIC_IN
8fa0: 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  IT to.** VDBE_MA
8fb0: 47 49 43 5f 52 55 4e 2e 0a 2a 2a 0a 2a 2a 20 54  GIC_RUN..**.** T
8fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
8fd0: 20 62 65 20 63 61 6c 6c 65 64 20 6d 6f 72 65 20   be called more 
8fe0: 74 68 61 6e 20 6f 6e 63 65 20 6f 6e 20 61 20 73  than once on a s
8ff0: 69 6e 67 6c 65 20 76 69 72 74 75 61 6c 20 6d 61  ingle virtual ma
9000: 63 68 69 6e 65 2e 0a 2a 2a 20 54 68 65 20 66 69  chine..** The fi
9010: 72 73 74 20 63 61 6c 6c 20 69 73 20 6d 61 64 65  rst call is made
9020: 20 77 68 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67   while compiling
9030: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
9040: 6e 74 2e 20 53 75 62 73 65 71 75 65 6e 74 0a 2a  nt. Subsequent.*
9050: 2a 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65  * calls are made
9060: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
9070: 70 72 6f 63 65 73 73 20 6f 66 20 72 65 73 65 74  process of reset
9080: 74 69 6e 67 20 61 20 73 74 61 74 65 6d 65 6e 74  ting a statement
9090: 20 74 6f 20 62 65 0a 2a 2a 20 72 65 2d 65 78 65   to be.** re-exe
90a0: 63 75 74 65 64 20 28 66 72 6f 6d 20 61 20 63 61  cuted (from a ca
90b0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ll to sqlite3_re
90c0: 73 65 74 28 29 29 2e 20 54 68 65 20 6e 56 61 72  set()). The nVar
90d0: 2c 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  , nMem, nCursor 
90e0: 0a 2a 2a 20 61 6e 64 20 69 73 45 78 70 6c 61 69  .** and isExplai
90f0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  n parameters are
9100: 20 6f 6e 6c 79 20 70 61 73 73 65 64 20 63 6f 72   only passed cor
9110: 72 65 63 74 20 76 61 6c 75 65 73 20 74 68 65 20  rect values the 
9120: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
9130: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  e function is ca
9140: 6c 6c 65 64 2e 20 4f 6e 20 73 75 62 73 65 71 75  lled. On subsequ
9150: 65 6e 74 20 63 61 6c 6c 73 2c 20 66 72 6f 6d 20  ent calls, from 
9160: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c  sqlite3_reset(),
9170: 20 6e 56 61 72 0a 2a 2a 20 69 73 20 70 61 73 73   nVar.** is pass
9180: 65 64 20 2d 31 20 61 6e 64 20 6e 4d 65 6d 2c 20  ed -1 and nMem, 
9190: 6e 43 75 72 73 6f 72 20 61 6e 64 20 69 73 45 78  nCursor and isEx
91a0: 70 6c 61 69 6e 20 61 72 65 20 61 6c 6c 20 70 61  plain are all pa
91b0: 73 73 65 64 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f  ssed zero..*/.vo
91c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
91d0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
91e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
91f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9200: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
9210: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9230: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
9240: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
9250: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ent */.  int nMe
9260: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
9270: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9280: 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  r of memory cell
9290: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
92a0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20  .  int nCursor, 
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
92d0: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61  ursors to alloca
92e0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  te */.  int nArg
92f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9300: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
9310: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  m number of args
9320: 20 69 6e 20 53 75 62 50 72 6f 67 72 61 6d 73 20   in SubPrograms 
9330: 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61  */.  int isExpla
9340: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
9350: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
9360: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
9370: 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a  rds is present *
9380: 2f 0a 20 20 69 6e 74 20 75 73 65 73 53 74 6d 74  /.  int usesStmt
9390: 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20  Journal         
93a0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
93b0: 74 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a  t Vdbe.usesStmtJ
93c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ournal */.){.  i
93d0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
93e0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
93f0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
9400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
9410: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
9420: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
9430: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
9440: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
9450: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9460: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
9470: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
9480: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
9490: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
94a0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
94b0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
94c0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
94d0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
94e0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
94f0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
9500: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
9510: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
9520: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
9530: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
9540: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
9550: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
9560: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
9570: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
9580: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
9590: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ace for.  ** Vdb
95a0: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
95b0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
95c0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
95d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
95e0: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
95f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
9600: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
9610: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
9620: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
9630: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
9640: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
9650: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
9660: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
9670: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
9680: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
9690: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
96a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
96b0: 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72  ace for memory r
96c0: 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61  egisters, SQL va
96d0: 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75  riables, VDBE cu
96e0: 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20  rsors and .  ** 
96f0: 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73  an array to mars
9700: 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  hal SQL function
9710: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20 54   arguments in. T
9720: 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65  his is only done
9730: 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
9740: 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74 69  time this functi
9750: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  on is called for
9760: 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20 6e   a given VDBE, n
9770: 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ot when it is.  
9780: 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  ** being called 
9790: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73  from sqlite3_res
97a0: 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74 68  et() to reset th
97b0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
97c0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56  e..  */.  if( nV
97d0: 61 72 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ar>=0 && ALWAYS(
97e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
97f0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 75 38 20 2a  ==0) ){.    u8 *
9800: 7a 43 73 72 20 3d 20 28 75 38 20 2a 29 26 70 2d  zCsr = (u8 *)&p-
9810: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20  >aOp[p->nOp];.  
9820: 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38    u8 *zEnd = (u8
9830: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   *)&p->aOp[p->nO
9840: 70 41 6c 6c 6f 63 5d 3b 0a 20 20 20 20 69 6e 74  pAlloc];.    int
9850: 20 6e 42 79 74 65 3b 0a 20 20 20 20 72 65 73 6f   nByte;.    reso
9860: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
9870: 6e 41 72 67 29 3b 0a 20 20 20 20 70 2d 3e 75 73  nArg);.    p->us
9880: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20  esStmtJournal = 
9890: 28 75 38 29 75 73 65 73 53 74 6d 74 4a 6f 75 72  (u8)usesStmtJour
98a0: 6e 61 6c 3b 0a 20 20 20 20 69 66 28 20 69 73 45  nal;.    if( isE
98b0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
98c0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d 20  0 ){.      nMem 
98d0: 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = 10;.    }.    
98e0: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
98f0: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20  zEnd-zCsr);.    
9900: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
9910: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 20 20 61  (u8*)0)&7;.    a
9920: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
9930: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
9940: 29 20 29 3b 0a 0a 20 20 20 20 64 6f 20 7b 0a 20  ) );..    do {. 
9950: 20 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a       nByte = 0;.
9960: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
9970: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 4d 65 6d  ((char*)&p->aMem
9980: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
9990: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
99a0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
99b0: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
99c0: 2a 29 26 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  *)&p->aVar, nVar
99d0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
99e0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
99f0: 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53  e);.      allocS
9a00: 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e  pace((char*)&p->
9a10: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
9a20: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c  of(Mem*), &zCsr,
9a30: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
9a40: 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65        allocSpace
9a50: 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 7a 56 61  ((char*)&p->azVa
9a60: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
9a70: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
9a80: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
9a90: 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63     allocSpace((c
9aa0: 68 61 72 2a 29 26 70 2d 3e 61 70 43 73 72 2c 20  har*)&p->apCsr, 
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ac0: 20 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66    nCursor*sizeof
9ad0: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 20 26  (VdbeCursor*), &
9ae0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
9af0: 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
9b00: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
9b10: 20 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20         p->pFree 
9b20: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9b30: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
9b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9b50: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
9b60: 0a 20 20 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  .      zEnd = &z
9b70: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20  Csr[nByte];.    
9b80: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
9b90: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9ba0: 65 64 20 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43  ed );..    p->nC
9bb0: 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75  ursor = (u16)nCu
9bc0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
9bd0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70  >aVar ){.      p
9be0: 2d 3e 6e 56 61 72 20 3d 20 28 75 31 36 29 6e 56  ->nVar = (u16)nV
9bf0: 61 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d  ar;.      for(n=
9c00: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
9c10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72  .        p->aVar
9c20: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
9c30: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d  Null;.        p-
9c40: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
9c50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9c60: 20 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20      if( p->aMem 
9c70: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  ){.      p->aMem
9c80: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
9c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
9ca0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
9cb0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d  nMem */.      p-
9cc0: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ce0: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
9cf0: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
9d00: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
9d10: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
9d20: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
9d30: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
9d40: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
9d50: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
9d60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
9d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
9d80: 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70  G.  for(n=1; n<p
9d90: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
9da0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
9db0: 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20  m[n].db==db );. 
9dc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e   }.#endif..  p->
9dd0: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
9de0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9df0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
9e00: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
9e10: 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70  explain |= isExp
9e20: 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  lain;.  p->magic
9e30: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
9e40: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
9e50: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
9e60: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
9e70: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
9e80: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
9e90: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
9ea0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
9eb0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
9ec0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
9ed0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
9ee0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
9ef0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
9f00: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
9f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9f20: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
9f30: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
9f40: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
9f50: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
9f60: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
9f70: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
9f80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9f90: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
9fa0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
9fb0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
9fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9fd0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78  n;.  }.  if( pCx
9fe0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
9ff0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
a000: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
a010: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
a020: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
a030: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
a040: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
a050: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
a060: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
a070: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
a080: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
a090: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
a0a0: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
a0b0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
a0c0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
a0d0: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
a0e0: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
a0f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
a100: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
a110: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
a120: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
a130: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
a140: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78  e *pModule = pCx
a150: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70  ->pModule;.    p
a160: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
a170: 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71   1;.    (void)sq
a180: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
a190: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
a1a0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
a1b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f  Cursor);.    (vo
a1c0: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
a1d0: 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70  On(p->db);.    p
a1e0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
a1f0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
a200: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
a210: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
a220: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
a230: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
a240: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
a250: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
a260: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
a270: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
a280: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
a290: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
a2a0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
a2b0: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
a2c0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
a2d0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
a2e0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
a2f0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
a300: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
a310: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
a320: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
a330: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
a340: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
a350: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
a360: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
a370: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
a380: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
a390: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
a3a0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
a3b0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
a3c0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
a3d0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
a3e0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
a3f0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
a400: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
a410: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
a420: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
a430: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
a440: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
a450: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
a460: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
a470: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
a480: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
a490: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
a4a0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
a4b0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
a4c0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
a4d0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
a4e0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
a4f0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
a500: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
a510: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
a520: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
a530: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
a540: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
a550: 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61  pFrame = p->pFra
a560: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
a570: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
a580: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
a590: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
a5a0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
a5b0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
a5c0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
a5d0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
a5e0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
a5f0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
a600: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
a610: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a620: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
a630: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
a640: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
a650: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
a660: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
a670: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
a680: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
a690: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
a6a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
a6b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
a6c0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
a6d0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
a6e0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
a6f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a700: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
a710: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
a720: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a730: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
a740: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
a750: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
a760: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
a770: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
a780: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
a790: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
a7a0: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
a7b0: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
a7c0: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
a7d0: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
a7e0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
a7f0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
a800: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a810: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
a820: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
a830: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
a840: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
a850: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
a860: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
a870: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
a880: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
a890: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
a8a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a8b0: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
a8c0: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30  ert( p->apCsr==0
a8d0: 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d   || p->apCsr[i]=
a8e0: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  =0 );.  for(i=1;
a8f0: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
a900: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
a910: 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b  m==0 || p->aMem[
a920: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75  i].flags==MEM_Nu
a930: 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ll );.#endif..  
a940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a950: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
a960: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
a970: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
a980: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
a990: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
a9a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
a9b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
a9c0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
a9d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
a9e0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
a9f0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
aa00: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
aa10: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
aa20: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
aa30: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
aa40: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
aa50: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
aa60: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
aa70: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
aa80: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
aa90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
aaa0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
aab0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
aac0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
aad0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
aae0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
aaf0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
ab00: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
ab10: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
ab20: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
ab30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
ab40: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
ab50: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
ab60: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
ab70: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
ab80: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
ab90: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
aba0: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
abb0: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
abc0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
abd0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
abe0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
abf0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
ac00: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
ac10: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
ac20: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
ac30: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
ac40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
ac50: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
ac60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
ac70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
ac80: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
ac90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
aca0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
acb0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
acc0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
acd0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
ace0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
acf0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
ad00: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
ad10: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
ad20: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
ad30: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
ad40: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
ad50: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
ad60: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
ad70: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
ad80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ad90: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
ada0: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
adb0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
adc0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
add0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
ade0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
adf0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
ae00: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
ae10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
ae20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
ae30: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
ae60: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
ae70: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae90: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
aea0: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
aeb0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
aee0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
aef0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
af00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
af10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
af20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
af30: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
af40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
af50: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
af70: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
af80: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
af90: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
afa0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
afb0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
afc0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
afd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
afe0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
aff0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
b000: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
b010: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
b020: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
b030: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
b040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b050: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
b060: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
b070: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
b080: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
b090: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
b0a0: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
b0b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
b0c0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
b0d0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
b0e0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
b0f0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
b100: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
b110: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
b120: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
b130: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b140: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
b150: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
b160: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
b170: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
b180: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
b190: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b1a0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
b1b0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
b1c0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
b1d0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
b1e0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
b1f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
b200: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
b210: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
b220: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b230: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
b240: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
b250: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
b260: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
b270: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
b280: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
b290: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
b2a0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
b2b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
b2c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
b2d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
b2e0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
b2f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
b300: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
b310: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
b320: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
b330: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
b340: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
b350: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
b360: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
b370: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
b380: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
b390: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
b3a0: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
b3b0: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
b3c0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
b3d0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
b3e0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
b3f0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
b400: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
b410: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
b420: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
b430: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
b440: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
b450: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
b460: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
b470: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
b480: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
b490: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b4a0: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
b4b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
b4c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
b4d0: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
b4e0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
b4f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b500: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b510: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
b520: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
b530: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
b540: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
b550: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
b560: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
b570: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
b580: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
b590: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
b5a0: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
b5b0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
b5c0: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
b5d0: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
b5e0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
b5f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b600: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
b610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
b620: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
b630: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
b640: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
b650: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
b660: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
b670: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
b680: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
b690: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
b6a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
b6b0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
b6c0: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
b6d0: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
b6e0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
b6f0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
b700: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
b710: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
b720: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
b730: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
b740: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
b750: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
b760: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
b770: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
b780: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
b790: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
b7a0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
b7b0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
b7c0: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
b7d0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
b7e0: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
b7f0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
b800: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
b810: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
b820: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
b830: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
b840: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
b850: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
b860: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
b870: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
b880: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
b890: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
b8a0: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
b8b0: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
b8c0: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
b8d0: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
b8e0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
b8f0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
b900: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
b910: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
b920: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
b930: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
b940: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
b950: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
b960: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
b970: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
b980: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
b990: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
b9a0: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
b9b0: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
b9c0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
b9d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
b9e0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
b9f0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
ba00: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
ba10: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
ba20: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
ba30: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
ba40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
ba50: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ba60: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ba70: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ba80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ba90: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
baa0: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
bab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
bac0: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
bad0: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
bae0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
baf0: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
bb00: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
bb10: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
bb20: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
bb30: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
bb40: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
bb50: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
bb60: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
bb70: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
bb80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
bb90: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
bba0: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
bbb0: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
bbc0: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
bbd0: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
bbe0: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
bbf0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
bc00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
bc10: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
bc20: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
bc30: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
bc40: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
bc50: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
bc60: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
bc70: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
bc80: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pBt);.      }.  
bc90: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
bca0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bcb0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
bcc0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
bcd0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
bce0: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
bcf0: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
bd00: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
bd10: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
bd20: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
bd30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
bd40: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
bd50: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
bd60: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
bd70: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
bd80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd90: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
bda0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
bdb0: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
bdc0: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
bdd0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
bde0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
bdf0: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
be00: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
be10: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
be20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
be30: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
be40: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
be50: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
be60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
be70: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
be80: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
be90: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
bea0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
beb0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
bec0: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
bed0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
bee0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
bef0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
bf00: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
bf10: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
bf20: 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
bf30: 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
bf40: 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  .      zMaster =
bf50: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
bf60: 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c  db, "%s-mj%08X",
bf70: 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e   zMainFile, iRan
bf80: 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b  dom&0x7fffffff);
bf90: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
bfa0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ter ){.        r
bfb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bfc0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
bfd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bfe0: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
bff0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
c000: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
c010: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
c020: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c030: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
c040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c050: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
c060: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c070: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
c080: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
c090: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
c0a0: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
c0b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
c0c0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
c0d0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
c0e0: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
c0f0: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
c100: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
c110: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
c120: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
c130: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c140: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
c150: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c160: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
c170: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
c180: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
c190: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
c1a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c1b0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
c1c0: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
c1d0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
c1e0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
c1f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
c200: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
c210: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
c220: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
c230: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
c240: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
c250: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
c260: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
c270: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
c280: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
c290: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
c2a0: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
c2b0: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
c2c0: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
c2d0: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
c2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
c2f0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
c300: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
c310: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
c320: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20       if( i==1 ) 
c330: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49  continue;   /* I
c340: 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64  gnore the TEMP d
c350: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
c360: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
c370: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
c380: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
c390: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
c3a0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
c3b0: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
c3c0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
c3d0: 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  e[0]==0 ) contin
c3e0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a  ue;  /* Ignore :
c3f0: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
c400: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  s */.        if(
c410: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
c420: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
c430: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
c440: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
c450: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
c460: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
c470: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
c480: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
c490: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
c4a0: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
c4b0: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
c4c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
c4d0: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
c4e0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c4f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c500: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c510: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
c520: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c530: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
c540: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
c550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
c560: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
c570: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
c580: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
c590: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c5a0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
c5b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c5c0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
c5d0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
c5e0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
c5f0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
c600: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
c610: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
c620: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
c630: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
c640: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c650: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
c660: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
c670: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
c680: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
c690: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
c6a0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
c6b0: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
c6c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
c6d0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
c6e0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
c6f0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
c700: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
c710: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c720: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
c730: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c740: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
c750: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
c760: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
c770: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
c780: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
c790: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
c7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
c7b0: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
c7c0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
c7d0: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
c7e0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
c7f0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
c800: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c810: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
c820: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
c830: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
c840: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
c850: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
c860: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
c870: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
c880: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
c890: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
c8a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c8b0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
c8c0: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
c8d0: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
c8e0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
c8f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c900: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
c910: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
c920: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
c930: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
c940: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
c950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c960: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
c970: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
c980: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
c990: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
c9a0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
c9b0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
c9c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c9d0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
c9e0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
c9f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ca00: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ca10: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
ca20: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ca30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ca40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ca50: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
ca60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ca70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
ca80: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ca90: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
caa0: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
cab0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
cac0: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
cad0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
cae0: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
caf0: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
cb00: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
cb10: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
cb20: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
cb30: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
cb40: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
cb50: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
cb60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cb70: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
cb80: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
cb90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
cba0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
cbb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
cbc0: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
cbd0: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
cbe0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
cbf0: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
cc00: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
cc10: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
cc20: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
cc30: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
cc40: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
cc50: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
cc60: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
cc70: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
cc80: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
cc90: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
cca0: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
ccb0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
ccc0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
ccd0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
cce0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
ccf0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
cd00: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
cd10: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
cd20: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
cd30: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
cd40: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
cd50: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
cd60: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
cd70: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
cd80: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
cd90: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
cda0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
cdb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
cdc0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
cdd0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
cde0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
cdf0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ce00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ce10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
ce20: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
ce30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ce40: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
ce50: 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
ce60: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
ce70: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
ce80: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
ce90: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
cea0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ceb0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
cec0: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
ced0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
cee0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
cef0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
cf00: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
cf10: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
cf20: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
cf30: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
cf40: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
cf50: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
cf60: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
cf70: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
cf80: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
cf90: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
cfa0: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
cfb0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
cfc0: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
cfd0: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
cfe0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
cff0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
d000: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
d010: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
d020: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
d030: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
d040: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
d050: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
d060: 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
d070: 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
d080: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
d090: 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d     if( p->magic=
d0a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
d0b0: 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && p->pc>=0 ){. 
d0c0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
d0d0: 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
d0e0: 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
d0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
d100: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
d110: 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
d120: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b  activeVdbeCnt );
d130: 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
d140: 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65  e==db->writeVdbe
d150: 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cnt );.}.#else.#
d160: 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
d170: 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
d180: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65  dif../*.** For e
d190: 76 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20  very Btree that 
d1a0: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
d1b0: 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20  ection db which 
d1c0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  .** has been mod
d1d0: 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72  ified, "trip" or
d1e0: 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68   invalidate each
d1f0: 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68   cursor in.** th
d200: 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68  at Btree might h
d210: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
d220: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75  d so that the cu
d230: 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65  rsor.** can neve
d240: 72 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e  r be used again.
d250: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77    This happens w
d260: 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  hen a rollback.*
d270: 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68  ** occurs.  We h
d280: 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20  ave to trip all 
d290: 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  the other cursor
d2a0: 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f  s, even.** curso
d2b0: 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73  r from other VMs
d2c0: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61   in different da
d2d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d2e0: 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e  ns,.** so that n
d2f0: 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20  one of them try 
d300: 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20  to use the data 
d310: 61 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  at which they.**
d320: 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61   were pointing a
d330: 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79  nd which now may
d340: 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67   have been chang
d350: 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65  ed due.** to the
d360: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
d370: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61   Remember that a
d380: 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65   rollback can de
d390: 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70  lete tables comp
d3a0: 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72  lete and.** reor
d3b0: 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20  der rootpages.  
d3c0: 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  So it is not suf
d3d0: 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20  ficient just to 
d3e0: 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74  save.** the stat
d3f0: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
d400: 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
d410: 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73  alidate the curs
d420: 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  or.** so that it
d430: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61   is never used a
d440: 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gain..*/.static 
d450: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43  void invalidateC
d460: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
d470: 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a  Btrees(sqlite3 *
d480: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
d490: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
d4a0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
d4b0: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
d4c0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
d4d0: 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72   p && sqlite3Btr
d4e0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
d4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
d500: 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
d510: 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f  rs(p, SQLITE_ABO
d520: 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  RT);.    }.  }.}
d530: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56  ../*.** If the V
d540: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
d550: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
d560: 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d   opened a statem
d570: 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent-transaction,
d580: 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77  .** close it now
d590: 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d  . Argument eOp m
d5a0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41  ust be either SA
d5b0: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
d5c0: 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   or.** SAVEPOINT
d5d0: 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20  _RELEASE. If it 
d5e0: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  is SAVEPOINT_ROL
d5f0: 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20  LBACK, then the 
d600: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
d610: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d620: 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20  ed back. If eOp 
d630: 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
d640: 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a  EASE, then the .
d650: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
d660: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
d670: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
d680: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
d690: 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
d6a0: 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
d6b0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
d6c0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
d6d0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
d6e0: 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
d6f0: 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
d700: 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
d710: 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
d720: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
d730: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
d740: 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
d750: 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
d760: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
d770: 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
d780: 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
d790: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d7a0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
d7b0: 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
d7c0: 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
d7d0: 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
d7e0: 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
d7f0: 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e   occured, causin
d800: 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
d810: 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
d820: 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
d830: 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
d840: 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
d850: 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
d860: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
d870: 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
d880: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
d890: 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
d8a0: 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
d8b0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
d8c0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
d8d0: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
d8e0: 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
d8f0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
d900: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
d910: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
d920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
d930: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
d940: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
d950: 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
d960: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d970: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
d980: 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
d990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d9a0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
d9b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
d9c0: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
d9d0: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
d9e0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
d9f0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
da00: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
da10: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
da20: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
da30: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
da40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
da50: 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
da60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
da70: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
da80: 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
da90: 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
daa0: 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
dab0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
dac0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
dad0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dae0: 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
daf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
db10: 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
db20: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
db30: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
db40: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
db50: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
db60: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
db70: 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
db80: 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
db90: 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
dba0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
dbb0: 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
dbc0: 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
dbd0: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
dbe0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
dbf0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
dc00: 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
dc10: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
dc20: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
dc30: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
dc40: 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
dc50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
dc60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
dc70: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
dc80: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
dc90: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
dca0: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
dcb0: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
dcc0: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
dcd0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
dce0: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
dcf0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
dd00: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
dd10: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
dd20: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
dd30: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
dd40: 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73 65 74  ing so it.** set
dd50: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
dd60: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
dd70: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
dd80: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
dd90: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
dda0: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
ddb0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
ddc0: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
ddd0: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
dde0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
ddf0: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
de00: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
de10: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
de20: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
de30: 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69 73 20  eeEnterAll() is 
de40: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
de50: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
de60: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
de70: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
de80: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
de90: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
dea0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
deb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dec0: 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f 75 72   the VM. Of cour
ded0: 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73 65 74  se only a subset
dee0: 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
def0: 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  ures.** will be 
df00: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
df10: 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75 6c 64  VM, and we could
df20: 20 75 73 65 20 56 64 62 65 2e 62 74 72 65 65 4d   use Vdbe.btreeM
df30: 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a 2a 2a  ask to figure.**
df40: 20 74 68 61 74 20 73 75 62 73 65 74 20 6f 75 74   that subset out
df50: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
df60: 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 64  o advantage to d
df70: 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49  oing so..**.** I
df80: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
df90: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
dfa0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
dfb0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
dfc0: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
dfd0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
dfe0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
dff0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e000: 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  CHE.void sqlite3
e010: 56 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e  VdbeMutexArrayEn
e020: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ter(Vdbe *p){.#i
e030: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
e040: 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42 74 72  AFE.  sqlite3Btr
e050: 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  eeMutexArrayEnte
e060: 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 23  r(&p->aMutex);.#
e070: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 42 74  else.  sqlite3Bt
e080: 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d 3e 64  reeEnterAll(p->d
e090: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  b);.#endif.}.#en
e0a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
e0b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e0c0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
e0d0: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
e0e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
e0f0: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
e100: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
e110: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
e120: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
e130: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
e140: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
e150: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
e160: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
e170: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
e180: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
e190: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
e1a0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
e1b0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
e1c0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
e1d0: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
e1e0: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
e1f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
e200: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
e210: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
e220: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
e230: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
e240: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
e250: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
e260: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
e270: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
e280: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e290: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
e2a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
e2b0: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
e2c0: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
e2d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
e2e0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
e2f0: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
e300: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
e310: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
e320: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
e330: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
e340: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e350: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
e360: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
e370: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
e380: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
e390: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
e3a0: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
e3b0: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
e3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
e3d0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
e3e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
e3f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
e400: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e410: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
e420: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
e430: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
e440: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
e450: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
e460: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
e470: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
e480: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
e490: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
e4a0: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
e4b0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
e4c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e4d0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
e4e0: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
e4f0: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
e500: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
e510: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
e520: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
e530: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
e540: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
e550: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
e560: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
e570: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
e580: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
e590: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
e5a0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
e5b0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
e5c0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
e5d0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
e5e0: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
e5f0: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
e600: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
e610: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
e620: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
e630: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
e640: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
e650: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
e660: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
e690: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
e6a0: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
e6b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e6c0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
e6d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
e6e0: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
e6f0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
e700: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
e710: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
e720: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
e730: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
e740: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
e750: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
e760: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
e770: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
e780: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
e790: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
e7a0: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
e7b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
e7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
e7d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
e7e0: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
e7f0: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
e800: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
e810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
e820: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
e830: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
e840: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
e850: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
e860: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
e870: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
e880: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
e890: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
e8a0: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
e8b0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
e8c0: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
e8d0: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
e8e0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
e8f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
e900: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e910: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
e920: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e930: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
e940: 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
e950: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
e960: 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
e970: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e980: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
e990: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
e9a0: 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
e9b0: 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
e9c0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
e9d0: 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
e9e0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
e9f0: 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
ea00: 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
ea10: 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
ea20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
ea30: 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
ea40: 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
ea50: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
ea60: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
ea70: 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
ea80: 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
ea90: 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
eaa0: 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
eab0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
eac0: 69 74 65 33 56 64 62 65 4d 75 74 65 78 41 72 72  ite3VdbeMutexArr
ead0: 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  ayEnter(p);..   
eae0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
eaf0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
eb00: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
eb10: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
eb20: 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  f;.    assert( p
eb30: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc!=SQLITE_IOE
eb40: 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f  RR_BLOCKED );  /
eb50: 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20  * This error no 
eb60: 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f  longer exists */
eb70: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
eb80: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
eb90: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
eba0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
ebd0: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
ebe0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
ebf0: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
ec00: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
ec10: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
ec20: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
ec30: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
ec40: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
ec50: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
ec60: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
ec70: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
ec80: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
ec90: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
eca0: 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
ecb0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
ecc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
ecd0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
ece0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
ecf0: 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
ed00: 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
ed10: 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
ed20: 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
ed30: 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
ed40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ed50: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
ed60: 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
ed70: 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
ed80: 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
ed90: 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
eda0: 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
edb0: 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
edc0: 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
edd0: 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
ede0: 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
edf0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76 61  /.          inva
ee00: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
ee10: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
ee20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ee30: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
ee40: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
ee50: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
ee60: 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
ee70: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
ee80: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
ee90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
eea0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
eeb0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
eec0: 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
eed0: 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
eee0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
eef0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ef00: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
ef10: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
ef20: 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
ef30: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
ef40: 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
ef50: 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
ef60: 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
ef70: 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
ef80: 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
ef90: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
efa0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
efb0: 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
efc0: 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
efd0: 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
efe0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
eff0: 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
f000: 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
f010: 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
f020: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f030: 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
f040: 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
f050: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
f060: 20 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74       && db->writ
f070: 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65  eVdbeCnt==(p->re
f080: 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
f090: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
f0a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
f0b0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
f0c0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
f0d0: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
f0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
f0f0: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
f100: 70 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20  p, 1) ){.       
f110: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
f120: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
f130: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
f140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f150: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
f160: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
f170: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
f180: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
f190: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
f1a0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
f1b0: 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
f1c0: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
f1d0: 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
f1e0: 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
f1f0: 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
f200: 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
f210: 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
f220: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f230: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
f240: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
f250: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
f260: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
f270: 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
f280: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
f290: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
f2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f2b0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
f2c0: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
f2d0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ex);.          r
f2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
f2f0: 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
f300: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f310: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f320: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
f330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
f340: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
f350: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f360: 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
f370: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
f380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
f390: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
f3a0: 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
f3b0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
f3c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f3d0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
f3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
f3f0: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
f400: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
f410: 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
f420: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
f430: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
f440: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
f450: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
f460: 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
f470: 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
f480: 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
f490: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
f4a0: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
f4b0: 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
f4c0: 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
f4d0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
f4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f4f0: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
f500: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
f510: 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
f520: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
f530: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
f540: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
f550: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
f560: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
f570: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
f580: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
f590: 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
f5a0: 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
f5b0: 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
f5c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
f5d0: 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
f5e0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
f5f0: 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
f600: 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
f610: 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
f620: 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
f630: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
f640: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
f650: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
f660: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
f670: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
f680: 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
f690: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
f6a0: 65 6e 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  en set the error
f6b0: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20  .    ** code to 
f6c0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20  the new value.. 
f6d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
f6e0: 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
f6f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f700: 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
f710: 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
f720: 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
f730: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
f740: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
f750: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
f760: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NT) ){.        p
f770: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
f780: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f790: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f7a0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72  ;.        p->zEr
f7b0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
f7c0: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
f7d0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
f7e0: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
f7f0: 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
f800: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f810: 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
f820: 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
f830: 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
f840: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f850: 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
f860: 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
f870: 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
f880: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
f890: 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
f8a0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f8b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f8c0: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
f8d0: 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
f8e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f8f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f900: 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
f910: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f920: 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
f930: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
f940: 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63  /* Rollback or c
f950: 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61  ommit any schema
f960: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63   changes that oc
f970: 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  curred. */.    i
f980: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
f990: 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73  _OK && db->flags
f9a0: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
f9b0: 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73  anges ){.      s
f9c0: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
f9d0: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
f9e0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
f9f0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
fa00: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
fa10: 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  anges);.    }.. 
fa20: 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
fa30: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
fa40: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
fa50: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
fa60: 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Mutex);.  }..  /
fa70: 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
fa80: 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
fa90: 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
faa0: 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
fab0: 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
fac0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
fad0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d  >activeVdbeCnt--
fae0: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65  ;.    if( !p->re
faf0: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
fb00: 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74  db->writeVdbeCnt
fb10: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  --;.    }.    as
fb20: 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
fb30: 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69  VdbeCnt>=db->wri
fb40: 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d  teVdbeCnt );.  }
fb50: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
fb60: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
fb70: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
fb80: 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
fb90: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
fba0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
fbb0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
fbc0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
fbd0: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
fbe0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
fbf0: 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
fc00: 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
fc10: 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
fc20: 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
fc30: 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
fc40: 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
fc50: 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
fc60: 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
fc70: 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
fc80: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
fc90: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
fca0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
fcb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
fcc0: 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
fcd0: 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
fce0: 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
fcf0: 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61  beCnt>0 || db->a
fd00: 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
fd10: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
fd20: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
fd30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
fd40: 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
fd50: 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
fd60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
fd70: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
fd80: 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
fd90: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
fda0: 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
fdb0: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
fdc0: 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
fdd0: 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
fde0: 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
fdf0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
fe00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
fe10: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
fe20: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
fe30: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
fe40: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
fe50: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
fe60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
fe70: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
fe80: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
fe90: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
fea0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
feb0: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
fec0: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
fed0: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
fee0: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
fef0: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
ff00: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
ff10: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
ff20: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
ff30: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
ff40: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
ff50: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
ff60: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
ff70: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
ff80: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
ff90: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
ffa0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
ffb0: 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
ffc0: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
ffd0: 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
ffe0: 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
fff0: 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
10000 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
10010 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
10020 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
10030 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
10040 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
10050 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28  it now..  */.  (
10060 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
10070 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69  tyOn(db);.  sqli
10080 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
10090 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
100a0 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20  afetyOff(db);.. 
100b0 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
100c0 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
100d0 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
100e0 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
100f0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
10100 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
10110 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
10120 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
10130 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
10140 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
10150 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
10160 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
10170 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
10180 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
10190 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
101a0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
101b0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
101c0 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
101d0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
101e0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
101f0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
10200 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
10210 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
10220 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
10230 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
10240 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c  Str(db->pErr,-1,
10250 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54  p->zErrMsg,SQLIT
10260 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
10270 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
10280 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
10290 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
102a0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d  db->errCode = p-
102b0 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  >rc;.      sqlit
102c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
102d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
102e0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
102f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
10300 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
10310 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
10320 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
10330 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
10340 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10350 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
10360 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
10370 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
10380 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
10390 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
103a0 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
103b0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
103c0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
103d0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
103e0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
103f0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
10400 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
10410 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
10420 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
10430 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
10440 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
10450 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10460 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
10470 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
10480 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
10490 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
104a0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
104b0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
104c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
104d0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
104e0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
104f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
10500 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
10510 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
10520 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
10530 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
10540 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
10550 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
10560 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
10570 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
10580 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
10590 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
105a0 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
105b0 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
105c0 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
105d0 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
105e0 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
105f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
10600 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
10610 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
10620 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
10630 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
10640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
10650 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
10660 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
10670 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
10680 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
10690 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c  (out, "%6d %10ll
106a0 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20  d %8lld ",.     
106b0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
106c0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
106d0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
106e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
106f0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
10700 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
10710 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
10720 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
10730 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10740 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
10750 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
10760 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
10770 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
10780 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61  }.#endif.  p->ma
10790 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
107a0 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
107b0 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
107c0 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
107d0 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
107e0 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
107f0 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
10800 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
10810 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
10820 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
10830 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
10840 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
10850 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
10860 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
10870 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
10880 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10890 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
108a0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
108b0 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
108c0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
108d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
108e0 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
108f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
10900 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
10910 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
10920 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
10930 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
10950 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
10960 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
10970 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
10980 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
10990 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
109a0 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
109b0 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
109c0 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
109d0 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
109e0 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
109f0 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
10a00 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
10a10 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
10a20 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
10a30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10a40 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
10a50 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
10a60 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
10a70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
10a80 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
10a90 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
10aa0 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
10ab0 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
10ac0 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
10ad0 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
10ae0 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31   !(mask&(((u32)1
10af0 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d  )<<i))) && pAux-
10b00 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69  >pAux ){.      i
10b10 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
10b20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
10b30 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
10b40 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
10b50 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20       pAux->pAux 
10b60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
10b70 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
10b80 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
10b90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
10ba0 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
10bb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
10bc0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
10bd0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
10be0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
10bf0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
10c00 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
10c10 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
10c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
10c30 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
10c40 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
10c50 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
10c60 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
10c70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
10c80 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10c90 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ev;.  }.  releas
10ca0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
10cb0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
10cc0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
10cd0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
10ce0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
10cf0 45 5f 4e 29 3b 0a 20 20 76 64 62 65 46 72 65 65  E_N);.  vdbeFree
10d00 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61  OpArray(db, p->a
10d10 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73  Op, p->nOp);.  s
10d20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10d30 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73   p->aLabel);.  s
10d40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10d50 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
10d60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10d70 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70  b, p->zSql);.  p
10d80 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
10d90 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c  AGIC_DEAD;.  sql
10da0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10db0 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69  ->pFree);.  sqli
10dc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
10dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
10de0 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  sure the cursor 
10df0 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65  p is ready to re
10e00 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
10e10 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a  row to which it.
10e20 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69  ** was last posi
10e30 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20  tioned.  Return 
10e40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10e50 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72   an OOM fault or
10e60 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72   I/O error.** pr
10e70 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70  events us from p
10e80 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63  ositioning the c
10e90 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72  ursor to its cor
10ea0 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rect position..*
10eb0 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
10ec0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
10ed0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
10ee0 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
10ef0 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
10f00 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f  o now.  If no mo
10f10 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63  ve is pending, c
10f20 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
10f30 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a  he row has been.
10f40 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  ** deleted out f
10f50 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
10f60 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68  rsor and if it h
10f70 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77  as, mark the row
10f80 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f   as.** a NULL ro
10f90 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
10fa0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
10fb0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
10fc0 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e  e correct row an
10fd0 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a  d that row has.*
10fe0 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74  * not been delet
10ff0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
11000 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  r the cursor, th
11010 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
11020 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
11030 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
11040 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43  rsorMoveto(VdbeC
11050 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
11060 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
11070 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
11080 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  s, rc;.#ifdef SQ
11090 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78  LITE_TEST.    ex
110a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
110b0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
110c0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
110d0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
110e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
110f0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
11100 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ked(p->pCursor, 
11110 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
11120 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
11130 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11140 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73  n rc;.    p->las
11150 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65  tRowid = p->move
11160 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 70 2d  toTarget;.    p-
11170 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
11180 41 4c 57 41 59 53 28 72 65 73 3d 3d 30 29 20 3f  ALWAYS(res==0) ?
11190 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  1:0;.    if( NEV
111a0 45 52 28 72 65 73 3c 30 29 20 29 7b 0a 20 20 20  ER(res<0) ){.   
111b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
111c0 74 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72  treeNext(p->pCur
111d0 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  sor, &res);.    
111e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
111f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64  n rc;.    }.#ifd
11200 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
11210 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63     sqlite3_searc
11220 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
11230 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65  f.    p->deferre
11240 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
11250 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
11260 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
11270 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
11280 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  S(p->pCursor) ){
11290 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
112a0 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
112b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
112c0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
112d0 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
112e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
112f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
11300 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
11310 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
11320 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
11330 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
11340 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
11350 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11360 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11370 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
11380 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
11390 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
113a0 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
113b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
113c0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
113d0 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
113e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
113f0 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
11400 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
11410 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
11420 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
11430 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
11440 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
11450 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
11460 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
11470 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
11480 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
11490 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
114a0 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
114b0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
114c0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
114d0 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
114e0 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
114f0 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
11500 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
11510 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
11520 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
11530 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
11540 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
11550 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
11560 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
11570 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
11580 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
11590 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
115a0 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
115b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
115c0 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
115d0 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
115e0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
115f0 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
11600 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
11610 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
11620 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
11630 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
11640 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
11650 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11660 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
11670 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
11680 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
11690 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
116a0 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
116b0 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
116c0 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
116e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
116f0 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
11700 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11730 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11760 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
11770 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
11790 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
117a0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
117b0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
117c0 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
117d0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
117e0 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
11810 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
11820 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
11830 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
11840 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
11850 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
11880 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
11890 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
118b0 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
118c0 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
118f0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
11900 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
11930 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
11940 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
11970 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
11980 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
11990 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
119a0 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
119b0 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
119c0 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
119d0 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
119e0 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
119f0 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
11a00 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
11a10 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
11a20 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
11a30 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
11a40 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
11a50 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
11a60 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
11a70 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
11a80 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
11a90 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
11aa0 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
11ab0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
11ac0 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
11ad0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
11ae0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
11af0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
11b00 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
11b10 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
11b20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
11b30 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
11b40 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
11b50 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
11b60 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
11b70 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
11b80 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
11b90 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
11ba0 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
11bb0 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
11bc0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
11bd0 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
11be0 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
11bf0 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
11c00 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
11c10 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c      }.    u = i<
11c20 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20  0 ? -i : i;.    
11c30 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
11c40 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
11c50 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
11c60 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
11c70 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
11c80 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
11c90 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
11ca0 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
11cb0 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
11cc0 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
11cd0 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
11ce0 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
11cf0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
11d00 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
11d10 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11d20 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
11d30 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
11d40 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
11d50 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
11d60 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
11d70 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
11d80 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
11d90 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
11da0 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
11db0 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
11dc0 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
11dd0 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
11de0 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
11df0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
11e00 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
11e10 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20  al-type..*/.u32 
11e20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11e30 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
11e40 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
11e50 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
11e60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
11e70 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
11e80 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
11e90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
11ea0 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
11eb0 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
11ec0 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
11ed0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
11ee0 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
11ef0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
11f00 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
11f10 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
11f20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
11f30 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
11f40 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
11f50 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
11f60 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
11f70 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
11f80 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
11f90 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
11fa0 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
11fb0 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
11fc0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
11fd0 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
11fe0 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
11ff0 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
12000 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
12010 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
12020 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
12030 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
12040 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
12050 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
12060 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
12070 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
12080 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
12090 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
120a0 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
120b0 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
120c0 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
120d0 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
120e0 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
120f0 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
12100 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
12110 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
12120 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
12130 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
12140 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
12150 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
12160 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
12170 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
12180 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
12190 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
121a0 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
121b0 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
121c0 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
121d0 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
121e0 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
121f0 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
12200 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
12210 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
12220 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
12230 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
12240 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
12250 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
12260 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
12270 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
12280 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
12290 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
122a0 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
122b0 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
122c0 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
122d0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
122e0 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
122f0 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
12300 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
12310 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
12320 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
12330 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
12340 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
12350 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
12360 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
12370 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
12380 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
12390 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
123a0 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
123b0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
123c0 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
123d0 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
123e0 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
123f0 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
12400 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
12410 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
12420 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
12430 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
12440 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
12450 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
12460 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
12470 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
12480 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
12490 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
124a0 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
124b0 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
124c0 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
124d0 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
124e0 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
124f0 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
12500 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
12510 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
12520 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
12530 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
12540 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
12550 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
12560 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
12570 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
12580 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
12590 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
125a0 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
125b0 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
125c0 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
125d0 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
125e0 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
125f0 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
12600 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
12610 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
12620 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
12630 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
12640 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
12650 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
12660 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
12670 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
12680 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
12690 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
126a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
126b0 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
126c0 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
126d0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
126e0 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
126f0 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
12700 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
12710 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
12720 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
12730 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
12740 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
12750 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
12760 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
12770 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
12780 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
12790 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
127a0 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
127b0 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
127c0 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
127d0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
127e0 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
127f0 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
12800 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
12810 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
12820 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
12830 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
12840 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
12850 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
12860 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
12870 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
12880 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
12890 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
128a0 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
128b0 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
128c0 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
128d0 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
128e0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
128f0 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
12900 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
12910 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
12920 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
12930 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
12940 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
12950 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12960 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12970 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
12980 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
12990 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
129a0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
129b0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
129c0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
129d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
129e0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
129f0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
12a00 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
12a10 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
12a20 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
12a30 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
12a40 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
12a50 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
12a60 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
12a70 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
12a80 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
12a90 61 74 29 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  at);.  u32 len;.
12aa0 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
12ab0 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
12ac0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
12ad0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
12ae0 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
12af0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
12b00 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
12b10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12b20 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
12b30 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
12b40 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
12b50 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
12b60 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
12b70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
12b80 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
12b90 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
12ba0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
12bb0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
12bc0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
12bd0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
12be0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
12bf0 3d 28 75 33 32 29 6e 42 75 66 20 29 3b 0a 20 20  =(u32)nBuf );.  
12c00 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a    while( i-- ){.
12c10 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28        buf[i] = (
12c20 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
12c30 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
12c40 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
12c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
12c60 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
12c70 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
12c80 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
12c90 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
12ca0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
12cb0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
12cc0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
12cd0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
12ce0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
12cf0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
12d00 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
12d10 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20  ( pMem->n<=nBuf 
12d20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
12d30 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
12d40 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
12d50 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  en);.    if( pMe
12d60 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
12d70 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e  ero ){.      len
12d80 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
12d90 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
12da0 20 6e 42 75 66 3e 3d 30 20 29 3b 0a 20 20 20 20   nBuf>=0 );.    
12db0 20 20 69 66 28 20 6c 65 6e 20 3e 20 28 75 33 32    if( len > (u32
12dc0 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  )nBuf ){.       
12dd0 20 6c 65 6e 20 3d 20 28 75 33 32 29 6e 42 75 66   len = (u32)nBuf
12de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12df0 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d  memset(&buf[pMem
12e00 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65  ->n], 0, len-pMe
12e10 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->n);.    }.   
12e20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
12e30 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
12e40 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
12e50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
12e60 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
12e70 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
12e80 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
12e90 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
12ea0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
12eb0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
12ec0 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
12ed0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12ee0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
12ef0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
12f00 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
12f10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
12f20 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
12f30 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
12f40 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
12f50 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
12f60 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
12f70 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
12f80 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
12f90 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
12fc0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
12fd0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
12fe0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
12ff0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
13000 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
13010 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
13020 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
13030 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
13040 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
13050 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
13060 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
13070 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
13080 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
13090 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
130a0 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
130b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
130c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
130d0 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  .i = (signed cha
130e0 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20  r)buf[0];.      
130f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
13100 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
13110 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
13120 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
13130 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13140 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
13150 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
13160 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
13170 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20  <8) | buf[1];.  
13180 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
13190 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
131a0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
131b0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
131c0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
131d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
131e0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
131f0 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
13200 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  0])<<16) | (buf[
13210 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b  1]<<8) | buf[2];
13220 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
13230 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
13240 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
13250 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
13260 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
13270 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
13280 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
13290 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
132a0 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
132b0 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
132c0 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  3];.      pMem->
132d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
132e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
132f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
13300 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
13310 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
13320 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28  .      u64 x = (
13330 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75  ((signed char)bu
13340 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b  f[0])<<8) | buf[
13350 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20  1];.      u32 y 
13360 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c  = (buf[2]<<24) |
13370 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20   (buf[3]<<16) | 
13380 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75  (buf[4]<<8) | bu
13390 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[5];.      x = 
133a0 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
133b0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
133c0 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
133d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
133e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
133f0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
13400 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
13410 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
13420 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
13430 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
13440 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
13450 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20       u64 x;.    
13460 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65    u32 y;.#if !de
13470 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26  fined(NDEBUG) &&
13480 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13490 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
134a0 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56  OINT).      /* V
134b0 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
134c0 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
134d0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
134e0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  e the same.     
134f0 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
13500 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
13510 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
13520 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
13530 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64        ** defined
13540 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f   that 64-bit flo
13550 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
13560 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69  es really are mi
13570 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64  xed.      ** end
13580 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ian..      */.  
13590 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
135a0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
135b0 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
135c0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
135d0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
135e0 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74  1.0;.      u64 t
135f0 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77  2 = t1;.      sw
13600 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
13610 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73  at(t2);.      as
13620 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
13630 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
13640 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
13650 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
13660 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
13670 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34   x = (buf[0]<<24
13680 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
13690 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
136a0 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79   buf[3];.      y
136b0 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20   = (buf[4]<<24) 
136c0 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c  | (buf[5]<<16) |
136d0 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62   (buf[6]<<8) | b
136e0 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[7];.      x =
136f0 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
13700 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
13710 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20  ype==6 ){.      
13720 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
13730 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20  i64*)&x;.       
13740 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
13750 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65  EM_Int;.      }e
13760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
13770 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
13780 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
13790 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  ->r)==8 );.     
137a0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
137b0 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
137c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
137d0 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  ->r, &x, sizeof(
137e0 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  x));.        pMe
137f0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
13800 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
13810 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
13820 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  M_Real;.      }.
13830 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a        return 8;.
13840 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
13850 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
13860 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
13870 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
13880 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
13890 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
138a0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
138b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
138c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
138d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
138e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ult: {.      u32
138f0 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74   len = (serial_t
13900 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
13910 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
13920 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
13930 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  em->n = len;.   
13940 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
13950 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  0;.      if( ser
13960 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b  ial_type&0x01 ){
13970 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
13980 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c  lags = MEM_Str |
13990 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20   MEM_Ephem;.    
139a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
139b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
139c0 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70  EM_Blob | MEM_Ep
139d0 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hem;.      }.   
139e0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
139f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13a00 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
13a10 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
13a20 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
13a30 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
13a40 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20  ], parse the.** 
13a50 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e  record into a Un
13a60 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
13a70 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
13a80 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
13a90 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
13aa0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
13ab0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
13ac0 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
13ad0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
13ae0 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
13af0 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
13b00 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
13b10 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
13b20 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
13b30 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
13b40 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
13b50 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
13b60 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
13b70 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
13b80 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
13b90 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
13ba0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
13bb0 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
13bc0 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
13bd0 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
13be0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
13bf0 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f  ckedRecord()..*/
13c00 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   .UnpackedRecord
13c10 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63   *sqlite3VdbeRec
13c20 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
13c30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
13c40 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
13c50 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
13c60 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
13c70 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
13c80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13c90 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
13ca0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
13cb0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
13cc0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
13cd0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
13ce0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
13cf0 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
13d00 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
13d10 20 68 6f 6c 64 20 74 68 65 20 6f 62 6a 65 63 74   hold the object
13d20 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
13d30 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
13d40 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
13d50 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
13d60 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
13d70 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
13d80 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13d90 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70  ar *)pKey;.  Unp
13da0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
13db0 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b 65 64   /* The unpacked
13dc0 20 72 65 63 6f 72 64 20 74 68 61 74 20 77 65 20   record that we 
13dd0 77 69 6c 6c 20 72 65 74 75 72 6e 20 2a 2f 0a 20  will return */. 
13de0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
13df0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73       /* Memory s
13e00 70 61 63 65 20 6e 65 65 64 65 64 20 74 6f 20 68  pace needed to h
13e10 6f 6c 64 20 70 2c 20 69 6e 20 62 79 74 65 73 20  old p, in bytes 
13e20 2a 2f 0a 20 20 69 6e 74 20 64 3b 0a 20 20 75 33  */.  int d;.  u3
13e30 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20  2 idx;.  u16 u; 
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e50 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
13e60 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
13e70 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
13e80 6d 3b 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  m;.  int nOff;  
13e90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
13ea0 65 61 73 65 20 70 53 70 61 63 65 20 62 79 20 74  ease pSpace by t
13eb0 68 69 73 20 6d 75 63 68 20 74 6f 20 38 2d 62 79  his much to 8-by
13ec0 74 65 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  te align it */. 
13ed0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 77   .  /*.  ** We w
13ee0 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
13ef0 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
13f00 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
13f10 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
13f20 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
13f30 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
13f40 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
13f50 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
13f60 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
13f70 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
13f80 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
13f90 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
13fa0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
13fb0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
13fc0 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
13fd0 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
13fe0 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 70  ) & 7)) & 7;.  p
13ff0 53 70 61 63 65 20 2b 3d 20 6e 4f 66 66 3b 0a 20  Space += nOff;. 
14000 20 73 7a 53 70 61 63 65 20 2d 3d 20 6e 4f 66 66   szSpace -= nOff
14010 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
14020 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
14030 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
14040 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
14050 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
14060 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
14070 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
14080 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
14090 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
140a0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
140b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
140c0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55      p->flags = U
140d0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45  NPACKED_NEED_FRE
140e0 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  E | UNPACKED_NEE
140f0 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 65 6c  D_DESTROY;.  }el
14100 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
14110 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 70 53 70  ackedRecord*)pSp
14120 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  ace;.    p->flag
14130 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s = UNPACKED_NEE
14140 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d 0a 20  D_DESTROY;.  }. 
14150 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
14160 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
14170 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
14180 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70  >nField + 1;.  p
14190 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20  ->aMem = pMem = 
141a0 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
141b0 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
141c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
141d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
141e0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
141f0 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
14200 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
14210 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
14220 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
14230 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
14240 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46  szHdr && u<p->nF
14250 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20  ield && d<=nKey 
14260 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
14270 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
14280 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
14290 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
142a0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
142b0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
142c0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
142d0 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
142e0 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ->db;.    pMem->
142f0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  flags = 0;.    p
14300 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
14310 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
14320 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
14330 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
14340 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
14350 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b    pMem++;.    u+
14360 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
14370 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
14380 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
14390 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72  >nField = u;.  r
143a0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
143b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
143c0 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
143d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
143e0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
143f0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14400 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
14410 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
14420 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
14430 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 20 61 73 73  em *pMem;..  ass
14440 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
14450 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 20  ssert( p->flags 
14460 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
14470 44 45 53 54 52 4f 59 20 29 3b 0a 20 20 66 6f 72  DESTROY );.  for
14480 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d  (i=0, pMem=p->aM
14490 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b  em; i<p->nField;
144a0 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
144b0 20 20 20 2f 2a 20 54 68 65 20 75 6e 70 61 63 6b     /* The unpack
144c0 65 64 20 72 65 63 6f 72 64 20 69 73 20 61 6c 77  ed record is alw
144d0 61 79 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ays constructed 
144e0 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  by the.    ** sq
144f0 6c 69 74 65 33 56 64 62 65 55 6e 70 61 63 6b 52  lite3VdbeUnpackR
14500 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e  ecord() function
14510 20 61 62 6f 76 65 2c 20 77 68 69 63 68 20 6d 61   above, which ma
14520 6b 65 73 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  kes all.    ** s
14530 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
14540 20 73 74 61 74 69 63 2e 20 20 41 6e 64 20 6e 6f   static.  And no
14550 6e 65 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ne of the elemen
14560 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 65 76  ts are.    ** ev
14570 65 72 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20  er transformed, 
14580 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
14590 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65  r anything to de
145a0 6c 65 74 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lete..    */.   
145b0 20 69 66 28 20 4e 45 56 45 52 28 70 4d 65 6d 2d   if( NEVER(pMem-
145c0 3e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71 6c 69  >zMalloc) ) sqli
145d0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
145e0 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  e(pMem);.  }.  i
145f0 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e  f( p->flags & UN
14600 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45  PACKED_NEED_FREE
14610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
14620 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66  bFree(p->pKeyInf
14630 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  o->db, p);.  }.}
14640 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14650 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
14660 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
14670 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
14680 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
14690 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
146a0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
146b0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
146c0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
146d0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
146e0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
146f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
14700 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
14710 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
14720 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
14730 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
14740 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
14750 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
14760 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
14770 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
14780 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
14790 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
147a0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
147b0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
147c0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
147d0 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
147e0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
147f0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
14800 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
14810 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
14820 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
14830 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
14840 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
14850 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
14860 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
14870 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
14880 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
14890 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
148a0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
148b0 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
148c0 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
148d0 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
148e0 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
148f0 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
14900 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
14910 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
14920 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
14930 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
14940 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
14950 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
14960 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
14970 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
14980 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
14990 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
149a0 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
149b0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
149c0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
149d0 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
149e0 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
149f0 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
14a00 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
14a10 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
14a20 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
14a30 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
14a40 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
14a50 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
14a60 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
14a70 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
14a80 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
14a90 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
14aa0 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
14ab0 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
14ac0 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
14ad0 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
14ae0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
14af0 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
14b00 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
14b10 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
14b20 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
14b30 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
14b40 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
14b50 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
14b60 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
14b70 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
14b80 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
14b90 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
14ba0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
14bb0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
14bc0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
14bd0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
14be0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
14bf0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
14c00 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
14c10 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
14c20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
14c30 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
14c40 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
14c50 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
14c60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
14c70 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
14c80 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
14c90 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
14ca0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
14cb0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
14cc0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
14cd0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
14ce0 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
14cf0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
14d00 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
14d10 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
14d20 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
14d30 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14d40 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
14d50 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
14d60 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
14d70 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
14d80 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
14d90 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
14da0 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61  ->db;.  mem1.fla
14db0 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 75  gs = 0;.  mem1.u
14dc0 2e 69 20 3d 20 30 3b 20 20 2f 2a 20 6e 6f 74 20  .i = 0;  /* not 
14dd0 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
14de0 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
14df0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 6d 65   warning */.  me
14e00 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m1.zMalloc = 0;.
14e10 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
14e20 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
14e30 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
14e40 7a 48 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b  zHdr1;.  if( pPK
14e50 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
14e60 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
14e70 49 44 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31  ID ){.    szHdr1
14e80 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64  --;.  }.  nField
14e90 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
14ea0 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  eld;.  while( id
14eb0 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
14ec0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b  PKey2->nField ){
14ed0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
14ee0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
14ef0 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
14f00 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
14f10 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
14f20 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
14f30 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
14f40 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
14f50 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20  erial_type1 );. 
14f60 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31     if( d1>=nKey1
14f70 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
14f80 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
14f90 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62  ial_type1)>0 ) b
14fa0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  reak;..    /* Ex
14fb0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
14fc0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
14fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
14fe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
14ff0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
15000 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
15010 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
15020 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
15030 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
15040 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
15050 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
15060 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20  ey2->aMem[i],.  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c           i<nFiel
15090 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  d ? pKeyInfo->aC
150a0 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20  oll[i] : 0);.   
150b0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
150c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
150d0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
150e0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
150f0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
15100 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 2a   used on mem1. *
15110 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6d 65  /.  if( NEVER(me
15120 6d 31 2e 7a 4d 61 6c 6c 6f 63 29 20 29 20 73 71  m1.zMalloc) ) sq
15130 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
15140 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f  ase(&mem1);..  /
15150 2a 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f  * If the PREFIX_
15160 53 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73  SEARCH flag is s
15170 65 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64  et and all field
15180 73 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e  s except the fin
15190 61 6c 0a 20 20 2a 2a 20 72 6f 77 69 64 20 66 69  al.  ** rowid fi
151a0 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
151b0 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
151c0 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
151d0 67 20 61 6e 64 20 73 65 74 20 0a 20 20 2a 2a 20  g and set .  ** 
151e0 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f  pPKey2->rowid to
151f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
15200 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e  e rowid field in
15210 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e   (pKey1, nKey1).
15220 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73  .  ** This is us
15230 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
15240 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
15250 2a 2f 0a 20 20 69 66 28 20 28 70 50 4b 65 79 32  */.  if( (pPKey2
15260 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
15270 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
15280 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
15290 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
152a0 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d    assert( idx1==
152b0 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a  szHdr1 && rc );.
152c0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
152d0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
152e0 20 29 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e   );.    pPKey2->
152f0 66 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b  flags &= ~UNPACK
15300 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
15310 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f  ;.    pPKey2->ro
15320 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
15330 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30    }..  if( rc==0
15340 20 29 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30   ){.    /* rc==0
15350 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
15360 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
15370 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
15380 64 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c  ds and.    ** al
15390 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
153a0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
153b0 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
153c0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
153d0 59 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  Y.    ** flag is
153e0 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
153f0 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
15400 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
15410 67 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ger..    ** If t
15420 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
15430 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
15440 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
15450 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
15460 78 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63  xes.    ** are c
15470 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
15480 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  equal.  Otherwis
15490 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65  e, the longer ke
154a0 79 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  y is the .    **
154b0 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20   larger.  As it 
154c0 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b  happens, the pPK
154d0 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ey2 will always 
154e0 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20  be the longer.  
154f0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73    ** if there is
15500 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20   a difference.. 
15510 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
15520 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
15530 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29  PACKED_INCRKEY )
15540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
15550 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
15560 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
15570 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
15580 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ATCH ){.      /*
15590 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
155a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64      }else if( id
155b0 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
155c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
155d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
155e0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
155f0 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
15600 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
15610 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
15620 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
15630 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
15640 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
15650 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
15660 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
15670 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
15680 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
15690 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
156a0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
156b0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
156c0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
156d0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
156e0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
156f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
15700 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
15710 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
15720 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
15730 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
15740 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
15750 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
15760 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
15770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15780 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
15790 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
157a0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
157b0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
157c0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
157d0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
157e0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
157f0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
15800 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
15810 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
15820 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
15830 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
15840 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
15850 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
15860 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
15870 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
15880 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
15890 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
158a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
158b0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
158c0 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
158d0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
158e0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
158f0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
15900 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
15910 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
15920 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
15930 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
15940 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
15950 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
15960 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
15970 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
15980 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
15990 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
159a0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
159b0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
159c0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
159d0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
159e0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
159f0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
15a00 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
15a10 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
15a20 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
15a30 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
15a40 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
15a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
15a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
15a70 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
15a80 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
15a90 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
15aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
15ab0 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
15ac0 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
15ad0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
15ae0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
15af0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
15b00 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
15b10 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
15b20 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
15b30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
15b40 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
15b50 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
15b60 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
15b70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
15b80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15b90 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
15ba0 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
15bb0 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
15bc0 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
15bd0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
15be0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
15bf0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
15c00 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
15c10 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
15c20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
15c30 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
15c40 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
15c50 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
15c60 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
15c70 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
15c80 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
15c90 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
15ca0 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
15cb0 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
15cc0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
15cd0 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
15ce0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
15cf0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
15d00 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
15d10 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
15d20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
15d30 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
15d40 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
15d50 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
15d60 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
15d70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
15d80 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
15d90 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
15da0 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
15db0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
15dc0 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
15dd0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
15de0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
15df0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
15e00 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
15e10 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
15e20 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
15e30 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
15e40 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
15e50 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
15e60 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
15e70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15e80 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
15e90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
15ea0 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
15eb0 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
15ec0 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
15ed0 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
15ee0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
15ef0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
15f00 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
15f10 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
15f20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
15f30 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
15f40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15f50 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
15f60 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
15f70 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
15f80 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
15f90 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
15fa0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
15fb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15fc0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
15fd0 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
15fe0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
15ff0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
16000 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
16010 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
16020 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
16030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16040 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
16050 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
16060 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
16070 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
16080 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
16090 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
160a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
160b0 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
160c0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
160d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
160e0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
160f0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
16100 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
16110 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
16120 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
16130 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
16140 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
16150 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
16160 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
16170 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
16180 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
16190 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
161a0 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
161b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
161c0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
161d0 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
161e0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
161f0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
16200 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
16210 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
16220 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
16230 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
16240 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
16250 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
16260 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
16270 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
16280 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
16290 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
162a0 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
162b0 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
162c0 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
162d0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
162e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
162f0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
16300 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
16310 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  C,             /
16320 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
16330 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
16340 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
16350 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20  ord *pUnpacked, 
16360 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
16370 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63  sion of key to c
16380 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
16390 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
163c0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
163d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
163e0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
163f0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
16400 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
16410 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
16420 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16430 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
16440 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
16450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16460 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
16470 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
16480 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
16490 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
164a0 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
164b0 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
164c0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
164d0 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
164e0 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
164f0 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
16500 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
16510 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   say.  ** that b
16520 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
16530 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
16540 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
16550 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
16560 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
16570 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
16580 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
16590 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
165a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
165b0 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  PT;.  }.  memset
165c0 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
165d0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
165e0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
165f0 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
16600 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
16610 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
16620 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
16630 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
16640 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
16650 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
16660 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20  GNORE_ROWID );. 
16670 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
16680 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
16690 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
166a0 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
166b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
166c0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
166d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
166e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
166f0 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
16700 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
16710 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
16720 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
16730 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
16740 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
16750 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
16760 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
16770 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
16780 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
16790 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
167a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
167b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
167c0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
167d0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
167e0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
167f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
16800 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
16810 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
16820 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
16830 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
16840 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
16850 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16860 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
16870 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
16880 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
16890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
168a0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
168b0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
168c0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
168d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
168e0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
168f0 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
16900 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
16910 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
16920 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
16930 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
16940 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
16950 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
16960 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
16970 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
16980 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
16990 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
169a0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
169b0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
169c0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
169d0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
169e0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
169f0 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
16a00 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
16a10 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
16a20 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
16a30 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
16a40 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
16a50 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
16a60 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
16a70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
16a80 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
16a90 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
16aa0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
16ab0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
16ac0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
16ad0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16ae0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
16af0 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
16b00 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
16b10 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
16b20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
16b30 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
16b40 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
16b50 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
16b60 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
16b70 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
16b80 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
16b90 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
16ba0 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
16bb0 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
16bc0 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
16bd0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
16be0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
16bf0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
16c00 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
16c10 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
16c20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
16c30 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
16c40 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
16c50 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
16c60 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
16c70 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
16c80 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
16c90 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
16ca0 65 47 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a  eGetValue(Vdbe *
16cb0 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20  v, int iVar, u8 
16cc0 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  aff){.  assert( 
16cd0 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
16ce0 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d  v ){.    Mem *pM
16cf0 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56  em = &v->aVar[iV
16d00 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30  ar-1];.    if( 0
16d10 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ==(pMem->flags &
16d20 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20   MEM_Null) ){.  
16d30 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
16d40 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  e *pRet = sqlite
16d50 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29  3ValueNew(v->db)
16d60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
16d70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16d80 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28  te3VdbeMemCopy((
16d90 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d  Mem *)pRet, pMem
16da0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16db0 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
16dc0 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20  nity(pRet, aff, 
16dd0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
16de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16df0 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d  eMemStoreType((M
16e00 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  em *)pRet);.    
16e10 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
16e20 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
16e30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16e40 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
16e50 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
16e60 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
16e70 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
16e80 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
16e90 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
16ea0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
16eb0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
16ec0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
16ed0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
16ee0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
16ef0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16f00 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
16f10 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
16f20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
16f30 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
16f40 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
16f50 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
16f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
16f70 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
16f80 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
16f90 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.