/ Hex Artifact Content
Login

Artifact dfe420bef5028dd41b3efb890d8b757dbe4b94b9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6c 6f 63 61 6c 20 61 6c 6c 20 62  also local all b
13a0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  trees..**.** The
13b0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
13c0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
13d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1400: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1410: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1420: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1430: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1440: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1450: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1460: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1470: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1480: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1490: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
14a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
14b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
14c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
14d0: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
14e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
14f0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1500: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1510: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1520: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1530: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1540: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1550: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1560: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1580: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15a0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
15b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
15c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15d0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
15e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1600: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1610: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1630: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1640: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1650: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1660: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1680: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1690: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
16a0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
16b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16c0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
16d0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
16e0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
16f0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1700: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1710: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1720: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1730: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1740: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1770: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1780: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1790: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
17a0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
17b0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
17c0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
17d0: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
17e0: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
17f0: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1800: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1810: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1820: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1830: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1840: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1850: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1860: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1870: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1880: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1890: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
18a0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
18b0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
18c0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
18d0: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
18e0: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
18f0: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1900: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1910: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1920: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1930: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
1940: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
1950: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
1960: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
1970: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
1980: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
1990: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19b0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
19c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
19d0: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a   = p->nLabel++;.
19e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
19f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1a00: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  NIT );.  if( i>=
1a10: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29  p->nLabelAlloc )
1a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
1a30: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1a40: 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   5;.    p->aLabe
1a50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1a60: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1a70: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e      n*sizeof(p->
1ab0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20  aLabel[0]));.   
1ac0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
1ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ae0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  cSize(p->db, p->
1af0: 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70  aLabel)/sizeof(p
1b00: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20  ->aLabel[0]);.  
1b10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1b20: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b30: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1b60: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1b80: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1b90: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1ba0: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1bb0: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
1bc0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1bd0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
1be0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1bf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c20: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1c30: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1c40: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1c50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1c60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1c70: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1c80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1ca0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1cb0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
1cc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
1cd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
1ce0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
1cf0: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
1d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
1d10: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
1d20: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
1d30: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
1d40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1d50: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1d60: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1d80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1d90: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1da0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1db0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1dc0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1de0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1df0: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1e00: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1e10: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1e20: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1e40: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1e50: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1e60: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1e70: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1e80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1e90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1ea0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1ed0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1ee0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1ef0: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1f00: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1f10: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1f20: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1f30: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1f40: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1f50: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f70: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1f80: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1f90: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1fa0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1fc0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1fd0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1fe0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1ff0: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2000: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2010: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2020: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2050: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2060: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2080: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2090: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
20a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
20d0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
20e0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
20f0: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2100: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2110: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2120: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2130: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2140: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2150: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2160: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2170: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2180: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2190: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
21a0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
21b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
21d0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
21e0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
21f0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2200: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2220: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2230: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2240: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2250: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2260: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2270: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2280: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
22a0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
22b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
22c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
22e0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
22f0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2300: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2310: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2330: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2340: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2360: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2370: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2380: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2390: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
23a0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
23b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
23c0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
23d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
23e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
23f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2400: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2410: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2420: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2440: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2450: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2460: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2470: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2480: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2490: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
24a0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
24b0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
24c0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
24d0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
24e0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
24f0: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2500: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2510: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2520: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2530: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2540: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2550: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2560: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2570: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
25c0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
25d0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
25e0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
25f0: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2600: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2610: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2620: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2630: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2640: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2660: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2670: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2680: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2690: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
26a0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
26b0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
26c0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
26d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
26e0: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
26f0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2700: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2710: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2720: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2730: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2740: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2750: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2760: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2780: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2790: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27a0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
27b0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
27c0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
27d0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
27e0: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
27f0: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2800: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
2810: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2820: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
2830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2840: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
2850: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
2860: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2870: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2880: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2890: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
28a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
28b0: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
28c0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
28d0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
28e0: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
28f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2900: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
2910: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
2920: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
2930: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
2940: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
2950: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
2960: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2970: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2980: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
29a0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
29b0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
29c0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
29d0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
29f0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2a00: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
2a10: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
2a20: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
2a30: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
2a40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2a50: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
2a60: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2a70: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2a80: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2a90: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2aa0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2ab0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2ac0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2ad0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2ae0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2af0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2b00: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2b10: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2b20: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2b30: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2b40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2b50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2b60: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2b70: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2b80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2b90: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ba0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2bb0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2bc0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2bd0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2be0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2bf0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2c00: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2c20: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2c30: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2c40: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2c50: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2c60: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2c70: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2c80: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ca0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2cb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2cc0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2cd0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2ce0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2cf0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2d00: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2d10: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2d20: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2d30: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2d40: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2d50: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2d60: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2d70: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2d80: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2d90: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2da0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2db0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2dc0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2e00: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2e20: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2e30: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2e40: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2e50: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2e60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2e70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2e80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2e90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2ea0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2ec0: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2ed0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2ee0: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2ef0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2f00: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2f10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2f20: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2f30: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2f40: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2f50: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2f60: 20 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50   if( (opcode==OP
2f70: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2f80: 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f  pOp->p2!=0) || o
2f90: 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d  pcode==OP_Vacuum
2fa0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61   ){.      p->rea
2fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64  dOnly = 0;.#ifnd
2fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
3000: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
3010: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
3020: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
3030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3040: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
3050: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
3060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3070: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
3080: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3090: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
30a0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
30b0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
30c0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
30d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
30e0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
30f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3100: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c  pcode==OP_Next |
3110: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  | opcode==OP_Sor
3120: 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  terNext ){.     
3130: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3140: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3150: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Next;.      pOp-
3160: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
3170: 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ANCE;.    }else 
3180: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50  if( opcode==OP_P
3190: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  rev ){.      pOp
31a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
31b0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31c0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ious;.      pOp-
31d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
31e0: 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ANCE;.    }..   
31f0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
3200: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
3210: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
3220: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3230: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
3240: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
3250: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
3260: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
3270: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
3280: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
3290: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
32a0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
32b0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32c0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
32d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
32e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
32f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3300: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3310: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3320: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3330: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3360: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3370: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3380: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3390: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
33b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
33c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
33d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
33e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
33f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3400: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3410: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3420: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3430: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3440: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3450: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3460: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3470: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3480: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3490: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
34b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
34c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
34d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
34e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
34f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3500: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3510: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3520: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3530: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3540: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3550: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3560: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3570: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3580: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3590: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
35b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
35c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
35d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
35f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3600: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3610: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3620: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3630: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3640: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
3650: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
3660: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
3670: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
3680: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
3690: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
36b0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
36c0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
36d0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
36e0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
36f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3700: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3710: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3730: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3740: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
3750: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
3760: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
3770: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3780: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3790: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37a0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
37b0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
37c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
37d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
37e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
37f0: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3810: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3820: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3830: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3840: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
3850: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
3860: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
3870: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
3880: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
3890: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38a0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
38b0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
38c0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
38d0: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
38e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
38f0: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3900: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3910: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3920: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3940: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
3950: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
3960: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
3970: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
3980: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39a0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
39b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
39c0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
39d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
39e0: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
39f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3a00: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
3a10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
3a20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
3a30: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
3a40: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
3a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3a60: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
3a70: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
3a80: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
3a90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3aa0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
3ab0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3ac0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ae0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3af0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3b00: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3b10: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
3b20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
3b30: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
3b40: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
3b50: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
3b60: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
3b70: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
3b80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b90: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
3ba0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3bb0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3bc0: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3bd0: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3be0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
3bf0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3c00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3c10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
3c20: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3c30: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3c40: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3c50: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3c60: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3c70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3c90: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3ca0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3cb0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3cc0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3cd0: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3ce0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3cf0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3d00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d10: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d20: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3d30: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3d60: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3d70: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
3d80: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3d90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
3da0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
3db0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3dc0: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
3dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3de0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3df0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
3e00: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
3e10: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
3e20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
3e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3e40: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
3e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3e60: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
3e70: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >aOp ){.    asse
3e80: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
3e90: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
3ea0: 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20  p-1].p5 = val;. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3ec0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
3ed0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
3ee0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
3ef0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3f00: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
3f10: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
3f20: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
3f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3f40: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
3f50: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
3f60: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3f70: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3f80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3f90: 20 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74   addr>=0 ) sqlit
3fa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3fb0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3fd0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3fe0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3ff0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
4000: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
4010: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
4020: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
4030: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
4040: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
4050: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4070: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4080: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4090: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
40a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
40b0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
40c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40d0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
40e0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
40f0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4100: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
4110: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
4120: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
4130: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
4140: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4160: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
4170: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
4180: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
4190: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
41a0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
41b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
41c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
41d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
41e0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
41f0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
4200: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4210: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
4220: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
4230: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
4240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4250: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
4260: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4270: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4280: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4290: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
42a0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
42b0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
42c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
42d0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
42e0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
42f0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4300: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4310: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4320: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4330: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4340: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4350: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4360: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4370: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
4380: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
4390: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
43a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
43b0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
43c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43e0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
43f0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4400: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4410: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4430: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4440: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4450: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4460: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4480: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
4490: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
44a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44b0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
44c0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
44f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4530: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4540: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4550: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4560: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4570: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
4580: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
4590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
45b0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
45c0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
45d0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
45e0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
45f0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4600: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4610: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4620: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4630: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4640: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4650: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4660: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4670: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4680: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
4690: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
46a0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
46b0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
46c0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
46d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
46e0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46f0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4700: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4710: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4730: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4740: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4750: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4760: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4770: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4780: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4790: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
47a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
47b0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
47c0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
47d0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
47e0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
47f0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4800: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4810: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4820: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4830: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4840: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4850: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4860: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4870: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4880: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
4890: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
48a0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
48b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
48c0: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
48d0: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
48e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
48f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4900: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4910: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4920: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4930: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4940: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4950: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
4960: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4970: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4980: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
4990: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
49a0: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
49b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
49c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
49d0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
49e0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
49f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4a00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a20: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4a30: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4a40: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4a50: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4a60: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4a70: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4a80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4a90: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4aa0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4ab0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
4ac0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
4ad0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4ae0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4af0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4b00: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4b10: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4b20: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4b30: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4b40: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4b50: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
4b60: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
4b70: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
4b80: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
4b90: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
4ba0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
4bb0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
4bc0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
4bd0: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
4be0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4bf0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4c00: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
4c10: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
4c20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
4c30: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4c40: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
4c50: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
4c60: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4c70: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
4c80: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
4c90: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
4ca0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
4cb0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
4cc0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
4cd0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
4ce0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
4cf0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
4d00: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d10: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
4d20: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
4d30: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
4d40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
4d50: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4d60: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
4d70: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
4d80: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
4d90: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
4da0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
4db0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4dc0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
4dd0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
4de0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
4df0: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
4e00: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
4e10: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
4e20: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
4e30: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
4e40: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
4e50: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
4e60: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
4e70: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
4e80: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
4e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4ea0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
4eb0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
4ed0: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
4ee0: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
4ef0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
4f00: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
4f10: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
4f20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4f30: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
4f40: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
4f50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f60: 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f  .    if ( n!=P4_
4f70: 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34  KEYINFO && n!=P4
4f80: 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20  _VTAB ) {.      
4f90: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
4fa0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
4fb0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
4fc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4fd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
4fe0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
4ff0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
5000: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
5010: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5020: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
5030: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
5040: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5050: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5060: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5070: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5080: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
5090: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
50a0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
50b0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
50c0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
50d0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
50e0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
50f0: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5100: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5110: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5120: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5130: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5140: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5150: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5160: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5170: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5180: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
5190: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
51a0: 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  FO ){.    KeyInf
51b0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
51c0: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79   int nField, nBy
51d0: 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20  te;..    nField 
51e0: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34  = ((KeyInfo*)zP4
51f0: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
5200: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
5210: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
5220: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
5230: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
5240: 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   + nField;.    p
5250: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5260: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
5270: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d  nByte);.    pOp-
5280: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
5290: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
52a0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
52b0: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
52c0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
52d0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
52e0: 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46   zP4, nByte - nF
52f0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f  ield);.      aSo
5300: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
5310: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
5320: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
5330: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
5340: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5350: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
5360: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
5370: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
5380: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5390: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
53a0: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
53b0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
53c0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34   }.      pOp->p4
53d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
53e0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
53f0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
5400: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5410: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5420: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
5430: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
5440: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
5450: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
5460: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5470: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5480: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5490: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
54a0: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
54b0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
54c0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
54d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41  >p4type = P4_VTA
54e0: 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  B;.    sqlite3Vt
54f0: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  abLock((VTable *
5500: 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72  )zP4);.    asser
5510: 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  t( ((VTable *)zP
5520: 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  4)->db==p->db );
5530: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30  .  }else if( n<0
5540: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5550: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5560: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5570: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
5580: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5590: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
55a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
55b0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
55c0: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
55d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
55e0: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
55f0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
5600: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
5610: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  f NDEBUG./*.** C
5620: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
5630: 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73  t on the the mos
5640: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
5650: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
5660: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
5670: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
5680: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
5690: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
56a0: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
56b0: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
56c0: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
56d0: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
56e0: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
56f0: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
5700: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
5710: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
5720: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5740: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
5750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5760: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
5770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5780: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
5790: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
57a0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
57b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
57c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
57d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
57e0: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
57f0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5800: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5810: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
5820: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5830: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
5840: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5850: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
5860: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
5870: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
5880: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5890: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
58a0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
58b0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
58c0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
58d0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
58e0: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
58f0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5910: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5920: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
5930: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5940: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5950: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5960: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
5970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5980: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
5990: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
59a0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
59b0: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
59c0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
59d0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
59e0: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
59f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5a00: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5a10: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5a20: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5a30: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5a40: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5a50: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5a60: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5a70: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5a80: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5a90: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5aa0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5ab0: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5ac0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5ad0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5ae0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5af0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5b00: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5b10: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5b20: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5b30: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5b40: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5b50: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5b60: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5b70: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5b80: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5b90: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5ba0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5bb0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5bc0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5bd0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5bf0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5c00: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5c10: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5c20: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5c30: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5c40: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5c50: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5c60: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5c70: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5c80: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5c90: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5ca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5cb0: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5cc0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5cd0: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5ce0: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5cf0: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5d00: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5d10: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5d20: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5d30: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5d40: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5d50: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5d60: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5d70: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5d80: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5d90: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5da0: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5db0: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5dc0: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5dd0: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5de0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5df0: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5e00: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5e10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5e20: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5e30: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5e40: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5e50: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5e60: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5e70: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5e80: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
5e90: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5ea0: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
5eb0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
5ec0: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
5ed0: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
5ee0: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
5ef0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5f00: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
5f10: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
5f20: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
5f30: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
5f40: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
5f50: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
5f60: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
5f70: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
5f80: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
5f90: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
5fa0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
5fb0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
5fc0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5fd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5fe0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
5ff0: 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74   p->nOp==0 ) ret
6000: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
6010: 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mmy;.#endif.    
6020: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
6030: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
6040: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
6050: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
6060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6070: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
6080: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
60a0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
60b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
60c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
60d0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
60e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
60f0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6100: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
6110: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
6120: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6130: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6140: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
6150: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
6160: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6170: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6180: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6190: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
61a0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
61b0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
61c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
61d0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
61e0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
61f0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6200: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
6210: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
6220: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
6230: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
6240: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
6250: 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20  EYINFO_STATIC:. 
6260: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
6270: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
6280: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
6290: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
62a0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
62b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
62c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
62d0: 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28  zTemp, "keyinfo(
62e0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
62f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
6300: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6310: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
6320: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
6330: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
6340: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
6350: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
6360: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
6370: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6380: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
6390: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
63a0: 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e  rlen30(pColl->zN
63b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
63c0: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
63d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
63e0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
63f0: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
6400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6420: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6430: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ',';.          
6440: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
6450: 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79  ortOrder && pKey
6460: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6470: 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
6480: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6490: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '-';.          }
64a0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
64b0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f  y(&zTemp[i], pCo
64c0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a  ll->zName,n+1);.
64d0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e            i += n
64e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
64f0: 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20  if( i+4<nTemp-6 
6500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
6510: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
6520: 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  nil",4);.       
6530: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
6540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6550: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6560: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
6570: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
6580: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
6590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
65a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
65b0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
65c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
65d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
65e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
65f0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6600: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
6610: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
6620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
6630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6640: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6650: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
6660: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
6670: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
6680: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6690: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
66a0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
66b0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
66c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66e0: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
66f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6700: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6710: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
6720: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
6730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6740: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
6750: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6760: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6770: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
6780: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
6790: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
67a0: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
67b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
67c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
67d0: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
67e0: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
67f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6800: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
6810: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
6820: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
6830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
6840: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6850: 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  _Null)==0 );.   
6860: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
6870: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
6880: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
6890: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
68a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
68b0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
68c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
68d0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
68e0: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
68f0: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
6900: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
6910: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
6920: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
6930: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6940: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
6950: 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20  6g", pMem->r);. 
6960: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6970: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
6980: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
6990: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
69a0: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
69b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
69c0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
69d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
69e0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
69f0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
6a00: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
6a10: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
6a20: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
6a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a40: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a50: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
6a60: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
6a70: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
6a80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a90: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
6aa0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
6ab0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6ac0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6ad0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6af0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
6b00: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
6b10: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6b20: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6b30: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
6b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6b50: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
6b60: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
6b70: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b90: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6ba0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6bb0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6bc0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6bd0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6be0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6bf0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6c00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6c10: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6c20: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
6c30: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
6c40: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
6c50: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
6c60: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
6c70: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
6c80: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6c90: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
6ca0: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
6cb0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
6cc0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
6cd0: 74 61 62 61 73 65 73 20 74 68 61 74 20 74 68 65  tabases that the
6ce0: 79 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 2e  y will be using.
6cf0: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
6d00: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
6d10: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
6d20: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 61 6e 64  p->btreeMask and
6d30: 20 69 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63   is used for loc
6d40: 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65 72 20 70  king and other p
6d50: 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64  urposes..*/.void
6d60: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
6d70: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
6d80: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
6d90: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
6da0: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
6db0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
6dc0: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
6dd0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
6de0: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
6df0: 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c    p->btreeMask |
6e00: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
6e10: 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  i;.  if( i!=1 &&
6e20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
6e30: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
6e40: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
6e50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28  p->lockMask |= (
6e60: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
6e70: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
6e80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6e90: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
6ea0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
6eb0: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  FE>0./*.** If SQ
6ec0: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
6ed0: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
6ee0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
6ef0: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
6f00: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
6f10: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
6f20: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6f30: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
6f40: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
6f50: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
6f60: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
6f70: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
6f80: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
6f90: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
6fa0: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
6fb0: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
6fc0: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
6fd0: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
6fe0: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
6ff0: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
7000: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
7010: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
7020: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
7030: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
7040: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
7050: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
7060: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
7070: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
7080: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
7090: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
70a0: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
70b0: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
70c0: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
70d0: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
70e0: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
70f0: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
7100: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
7110: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
7120: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
7130: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
7140: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
7150: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
7160: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
7170: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
7180: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
7190: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
71a0: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
71b0: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
71c0: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
71d0: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
71e0: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
71f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7200: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
7210: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
7220: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
7230: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
7240: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
7250: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
7260: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
7270: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
7280: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
7290: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
72a0: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
72b0: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
72c0: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
72d0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
72e0: 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
72f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7300: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
7310: 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c   nDb;.  if( p->l
7320: 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74  ockMask==0 ) ret
7330: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
7340: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
7350: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
7360: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
7370: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
7380: 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69  r(i=0, mask=1; i
7390: 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20  <nDb; i++, mask 
73a0: 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66  += mask){.    if
73b0: 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20  ( i!=1 && (mask 
73c0: 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d  & p->lockMask)!=
73d0: 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  0 && ALWAYS(aDb[
73e0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
73f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7400: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
7410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
7420: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
7430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7440: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
7450: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
7460: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
7470: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
7480: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
7490: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
74a0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
74b0: 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ter()..*/.void s
74c0: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
74d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
74e0: 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73  i;.  yDbMask mas
74f0: 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k;.  sqlite3 *db
7500: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
7510: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d  nt nDb;.  if( p-
7520: 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72  >lockMask==0 ) r
7530: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
7540: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
7550: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
7560: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
7570: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
7580: 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b  for(i=0, mask=1;
7590: 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73   i<nDb; i++, mas
75a0: 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20  k += mask){.    
75b0: 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73  if( i!=1 && (mas
75c0: 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  k & p->lockMask)
75d0: 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44  !=0 && ALWAYS(aD
75e0: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7600: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
7610: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
7620: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
7630: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
7640: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
7650: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
7660: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
7670: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
7680: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
7690: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
76a0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
76b0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
76c0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
76d0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
76e0: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
76f0: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
7700: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
7710: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
7720: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
7730: 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22   %-4s %.2X %s\n"
7740: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
7750: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
7760: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
7770: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
7780: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66  zeof(zPtr));.  f
7790: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
77a0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
77b0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
77c0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
77d0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
77e0: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
77f0: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65  , pOp->p5,.#ifde
7800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7810: 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65       pOp->zComme
7820: 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  nt ? pOp->zComme
7830: 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20  nt : "".#else.  
7840: 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20      "".#endif.  
7850: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
7860: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
7870: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
7880: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
7890: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
78a0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
78b0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
78c0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
78d0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
78e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  nd;.    sqlite3 
78f0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
7900: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
7910: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
7920: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
7930: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
7940: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64  {.      for(pEnd
7950: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
7960: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p++){.        sq
7970: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7980: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
7990: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
79a0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
79b0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
79c0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
79d0: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
79e0: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
79f0: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20  b==p[1].db );.. 
7a00: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
7a10: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
7a20: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
7a30: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
7a40: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
7a50: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
7a60: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
7a70: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
7a80: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
7a90: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
7aa0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
7ab0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
7ac0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
7ad0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
7ae0: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
7af0: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
7b00: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
7b10: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
7b20: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
7b30: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
7b40: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
7b50: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
7b60: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
7b70: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
7b80: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
7b90: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
7ba0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
7bb0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
7bc0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
7bd0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
7be0: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
7bf0: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
7c00: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
7c10: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
7c20: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
7c30: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
7c40: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
7c50: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
7c60: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
7c70: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
7c80: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
7c90: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
7ca0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
7cb0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
7cc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
7cd0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7ce0: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
7cf0: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
7d00: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
7d10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d20: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7d30: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
7d40: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e if( p->zMalloc
7d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
7d70: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
7d80: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20     p->zMalloc = 
7d90: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
7da0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d    p->flags = MEM
7db0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _Null;.    }.   
7dc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7dd0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7de0: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7df0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7e00: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7e10: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7e20: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7e30: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7e40: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7e50: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7e60: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7e70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7e80: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7e90: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7ea0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7eb0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7ec0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7ed0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7ee0: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7ef0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7f00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7f10: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7f30: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7f40: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7f50: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7f60: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7f70: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7f80: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7f90: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7fa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fb0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7fc0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7fd0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7fe0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
7ff0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8000: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
8010: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
8020: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
8030: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
8040: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
8050: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
8060: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
8070: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
8080: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
8090: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
80a0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
80b0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
80c0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
80d0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
80e0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
80f0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
8100: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
8110: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
8120: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
8130: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
8140: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
8150: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
8160: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
8170: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
8180: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
8190: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
81a0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
81b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
81c0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
81d0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
81e0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
81f0: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
8200: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
8210: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
8220: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
8230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8240: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
8250: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
8280: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
8290: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
82a0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
82d0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
82e0: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
82f0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
8300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8310: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
8320: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
8330: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8350: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
8360: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
8370: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
8380: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83a0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
83b0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
83c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
83f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
8400: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8420: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8430: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
8440: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
8450: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8460: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
8470: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
8480: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
8490: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
84a0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
84b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
84c0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
84d0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
84e0: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
84f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
8500: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
8510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
8520: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
8530: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
8540: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
8550: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
8560: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
8570: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
8580: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
8590: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
85a0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
85b0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
85c0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
85d0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
85e0: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
85f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8600: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
8610: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8620: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
8630: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
8640: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
8650: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
8660: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
8670: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
8680: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
8690: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
86a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
86b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
86d0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
86e0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
86f0: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
8700: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
8710: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
8720: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
8730: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
8740: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
8750: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
8760: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
8780: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
8790: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
87a0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
87b0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
87c0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
87d0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
87e0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
87f0: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
8800: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
8810: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
8820: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
8830: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
8840: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
8850: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
8860: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
8870: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
8880: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
8890: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
88a0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
88b0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
88c0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
88d0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
88e0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
88f0: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
8900: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
8910: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
8920: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
8930: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
8940: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
8950: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
8960: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
8970: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
8980: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
8990: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
89a0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
89b0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
89c0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
89d0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
89e0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
89f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8a00: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8a10: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8a20: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8a30: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8a40: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8a50: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8a60: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8a70: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8a80: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
8a90: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
8aa0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
8ab0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8ac0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8ad0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
8ae0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8af0: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8b00: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8b10: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8b20: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8b30: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8b40: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8b50: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8b60: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8b70: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8b90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
8ba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
8bb0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
8bc0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
8bd0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
8be0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8bf0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8c00: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8c10: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8c20: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8c30: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8c50: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8c60: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8c70: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8c80: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
8c90: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
8ca0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
8cb0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
8cc0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
8cd0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
8ce0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d00: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8d10: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8d20: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8d30: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8d40: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8d50: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8d60: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8d70: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8d80: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
8d90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
8da0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
8db0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8dc0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
8dd0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
8de0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8df0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8e00: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8e10: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8e20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e30: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8e40: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8e50: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8e60: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e90: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
8ea0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
8eb0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
8ec0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
8ed0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
8ee0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8ef0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8f00: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8f10: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8f20: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8f30: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8f40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8f50: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8f60: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8f70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8f80: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8f90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8fa0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8fb0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
8fc0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
8fd0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8fe0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
8ff0: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
9000: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
9010: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
9020: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
9030: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
9040: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
9050: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
9060: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
9070: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
9080: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
9090: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
90a0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
90b0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
90c0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
90d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
90e0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
90f0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
9100: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
9110: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
9120: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9130: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
9140: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9150: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
9160: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
9170: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
9180: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
9190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91a0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
91b0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
91c0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
91d0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29  Sub, nByte, 1) )
91e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
91f0: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
9200: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
9210: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
9220: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
9230: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
9240: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
9250: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
9260: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
9270: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
9280: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
9290: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
92a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
92b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
92c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
92d0: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92f0: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
9300: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9310: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9320: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9330: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9340: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9350: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
9380: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9390: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
93a0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
93b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
93c0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
93d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93f0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
9400: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9410: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
9420: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9430: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9440: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
9450: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
9460: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
9470: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
9480: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9490: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
94a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
94b0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
94c0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
94d0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
94e0: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
94f0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
9500: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
9510: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
9520: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9530: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
9540: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
9550: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
9570: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
9580: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
9590: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
95a0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
95b0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
95c0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
95d0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
95e0: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
95f0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
9600: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
9620: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
9630: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
9640: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9660: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9670: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
9680: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
9690: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
96a0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
96b0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
96c0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
96d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
96e0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
96f0: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
9700: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
9710: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9720: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
9730: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9740: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
9750: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
9760: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
9770: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
9780: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
9790: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
97a0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
97b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
97c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
97d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
97e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
97f0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
9800: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9810: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9820: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9830: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9840: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
9850: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
9860: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9870: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
98a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
98b0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
98c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
98d0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
98e0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
98f0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
9900: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
9910: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
9920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9930: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
9940: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
9950: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
9960: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9970: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
9980: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
9990: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
99a0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
99b0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
99c0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
99d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
99e0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
99f0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9a00: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9a10: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
9a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9a30: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9a40: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9a50: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9a60: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9a80: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
9a90: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
9aa0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
9ab0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
9ac0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
9ad0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
9ae0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9af0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
9b00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9b10: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
9b20: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
9b30: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
9b40: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
9b50: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9b60: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
9b70: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9b80: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
9b90: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
9ba0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
9bb0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
9bc0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9bd0: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9be0: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9bf0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9c00: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9c10: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
9c20: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
9c30: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
9c40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9c50: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
9c60: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
9c70: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
9c80: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
9c90: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
9ca0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
9cb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9cc0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
9cd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
9ce0: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
9cf0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9d00: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
9d10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9d20: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
9d30: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9d40: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
9d50: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9d60: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
9d70: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9d80: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9d90: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
9da0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
9db0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
9dc0: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
9dd0: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
9de0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
9df0: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
9e00: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
9e10: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
9e20: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9e30: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
9e40: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
9e50: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
9e60: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
9e70: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
9e80: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
9e90: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
9ea0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
9eb0: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
9ec0: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
9ed0: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
9ee0: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
9ef0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
9f00: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
9f10: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
9f20: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
9f30: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
9f40: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
9f50: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
9f60: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
9f70: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
9f80: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
9f90: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
9fa0: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
9fb0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9fc0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
9fd0: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
9fe0: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
9ff0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
a000: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
a010: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a020: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
a030: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
a040: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
a050: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
a060: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
a070: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
a080: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
a090: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
a0a0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
a0b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a0c0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
a0d0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
a0e0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
a0f0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
a100: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
a110: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
a120: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
a130: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
a140: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
a150: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
a160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a170: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
a180: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
a190: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
a1a0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
a1b0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
a1c0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
a1d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a1e0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
a1f0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
a200: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
a210: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
a220: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
a230: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
a240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a250: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
a260: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
a270: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
a280: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
a290: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
a2a0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
a2b0: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
a2c0: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
a2d0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
a2e0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
a2f0: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
a300: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
a310: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
a320: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
a330: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
a340: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
a350: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
a360: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
a370: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
a380: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
a390: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
a3a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a3b0: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
a3c0: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
a3d0: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
a3e0: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
a3f0: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
a400: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
a410: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a420: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
a440: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
a450: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
a460: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
a470: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
a480: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
a490: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
a4a0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
a4b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
a4c0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
a4d0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a4e0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
a4f0: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
a500: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
a510: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
a520: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
a530: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a540: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
a550: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a560: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
a570: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
a580: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
a590: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
a5a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
a5b0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
a5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a5d0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
a5e0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
a5f0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
a600: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
a610: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
a620: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
a630: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
a640: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
a650: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
a660: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
a670: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
a680: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
a690: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a6a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
a6b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
a6c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
a6d0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
a6e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
a6f0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
a700: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
a710: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
a720: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
a730: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
a740: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a750: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
a760: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
a770: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
a780: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
a790: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
a7a0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
a7b0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
a7c0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
a7d0: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
a7e0: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
a7f0: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
a800: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
a810: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
a820: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
a830: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20  lled exact once 
a840: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61  on a each virtua
a850: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
a860: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
a870: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
a880: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
a890: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
a8a0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
a8b0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
a8c0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74  e is called, fut
a8d0: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
a8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8f0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
a900: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
a910: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
a920: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
a930: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
a940: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
a950: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
a960: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
a970: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
a980: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
a990: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
a9a0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
a9b0: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
a9c0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
a9d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a9e0: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
a9f0: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
aa00: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
aa10: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
aa20: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
aa30: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
aa40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
aa50: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
aa60: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa80: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
aa90: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aab0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
aac0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
aad0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
aae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
aaf0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ab00: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
ab10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ab30: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
ab40: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ab70: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
ab80: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
ab90: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
aba0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
abb0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
abc0: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
abd0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
abe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
abf0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ac00: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
ac10: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ac40: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
ac50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
ac60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
ac70: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
ac80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
ac90: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
acb0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
acc0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
acd0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
ace0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
acf0: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
ad00: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
ad10: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
ad20: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ad30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
ad40: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
ad50: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
ad60: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
ad70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ad80: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
ad90: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
ada0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
adb0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72  );.  nVar = pPar
adc0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d  se->nVar;.  nMem
add0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
ade0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61  .  nCursor = pPa
adf0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72  rse->nTab;.  nAr
ae00: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78  g = pParse->nMax
ae10: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  Arg;.  .  /* For
ae20: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
ae30: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
ae40: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
ae50: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
ae60: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
ae70: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
ae80: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
ae90: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
aea0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
aeb0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
aec0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
aed0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
aee0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
aef0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
af00: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
af10: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
af20: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
af30: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
af40: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
af50: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
af60: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
af70: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
af80: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
af90: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
afa0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
afb0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
afc0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
afd0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
afe0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
aff0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
b000: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
b010: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
b020: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
b030: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
b040: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
b050: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
b060: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
b070: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
b080: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
b090: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
b0a0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
b0b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
b0c0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
b0d0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a  ->nOpAlloc];  /*
b0e0: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
b0f0: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a   end of zCsr[] *
b100: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
b110: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
b120: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
b130: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
b140: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
b150: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
b160: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
b170: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
b180: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
b190: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
b1a0: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
b1b0: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43  zEnd-zCsr);.  zC
b1c0: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75  sr += (zCsr - (u
b1d0: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72  8*)0)&7;.  asser
b1e0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b1f0: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b  IGNMENT(zCsr) );
b200: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
b210: 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72 65 64  0;..  p->expired
b220: 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 4d 65   = 0;.  .  /* Me
b230: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
b240: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
b250: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
b260: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f  allocated in two
b270: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
b280: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
b290: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
b2a0: 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  e unused space a
b2b0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
b2c0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
b2d0: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
b2e0: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
b2f0: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
b300: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
b310: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
b320: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
b330: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
b340: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
b350: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
b360: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
b370: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
b380: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
b390: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
b3a0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
b3b0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
b3c0: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
b3d0: 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63  he leftover spac
b3e0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
b3f0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
b400: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
b410: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
b420: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
b430: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
b440: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b450: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
b460: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
b470: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
b480: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
b490: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
b4a0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b4b0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
b4c0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
b4d0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
b4e0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
b4f0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b500: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
b510: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
b520: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
b530: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
b540: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b550: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
b560: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
b570: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
b580: 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  ar*), &zCsr, zEn
b590: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b5a0: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
b5b0: 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20  Space(p->apCsr, 
b5c0: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
b5d0: 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20  dbeCursor*),.   
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45         &zCsr, zE
b600: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
b610: 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
b620: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
b630: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
b640: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
b650: 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20     }.    zCsr = 
b660: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45  p->pFree;.    zE
b670: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
b680: 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  ];.  }while( nBy
b690: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
b6a0: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
b6b0: 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29  >nCursor = (u16)
b6c0: 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  nCursor;.  if( p
b6d0: 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  ->aVar ){.    p-
b6e0: 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e  >nVar = (ynVar)n
b6f0: 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  Var;.    for(n=0
b700: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
b710: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b720: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
b730: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  l;.      p->aVar
b740: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
b750: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
b760: 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  azVar ){.    p->
b770: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
b780: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
b790: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
b7a0: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
b7b0: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
b7c0: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
b7d0: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
b7e0: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
b7f0: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
b800: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
b810: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
b820: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
b830: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
b840: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
b850: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
b860: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
b870: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
b880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
b890: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
b8a0: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
b8b0: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
b8c0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
b8d0: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
b8e0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
b8f0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
b900: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
b910: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
b920: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
b930: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
b940: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
b950: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
b960: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
b970: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
b980: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
b990: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
b9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b9b0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
b9c0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
b9d0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
b9e0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
b9f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
ba00: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
ba10: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
ba20: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
ba30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
ba40: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
ba50: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
ba60: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
ba70: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
ba80: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
ba90: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
baa0: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
bab0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
bac0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
bad0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bae0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
baf0: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
bb00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bb10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
bb20: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
bb30: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
bb40: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
bb50: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
bb60: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
bb70: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
bb80: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
bb90: 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64  dule = pCx->pMod
bba0: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
bbb0: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
bbc0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
bbd0: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
bbe0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
bbf0: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
bc00: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  dif.}../*.** Cop
bc10: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
bc20: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
bc30: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
bc40: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
bc50: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
bc60: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
bc70: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
bc80: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
bc90: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
bca0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
bcb0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
bcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
bcd0: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
bce0: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
bcf0: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
bd00: 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  >v;.  v->aOp = p
bd10: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
bd20: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
bd30: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
bd40: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
bd50: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
bd60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
bd70: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
bd80: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
bd90: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
bda0: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
bdb0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
bdc0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
bdd0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
bde0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65  e->nChange;.  re
bdf0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
be00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
be10: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
be20: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
be30: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
be40: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
be50: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
be60: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
be70: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
be80: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
be90: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
bea0: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
beb0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
bec0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
bed0: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
bee0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
bef0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
bf00: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
bf10: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
bf20: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
bf30: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
bf40: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
bf50: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
bf60: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
bf70: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
bf80: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
bf90: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
bfa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bfb0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
bfc0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
bfd0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
bfe0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
bff0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
c000: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
c010: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
c020: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
c030: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
c040: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
c050: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
c060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c070: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
c080: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
c090: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
c0a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c0b0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
c0c0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
c0d0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
c0e0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
c0f0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
c100: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
c110: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
c120: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
c130: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
c140: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
c150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
c160: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
c170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
c180: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
c190: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
c1a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c1b0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
c1c0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
c1d0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
c1e0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
c1f0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
c200: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
c210: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
c220: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
c230: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
c240: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
c250: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
c260: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
c270: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
c280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c290: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
c2a0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c2b0: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
c2c0: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
c2d0: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
c2e0: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
c2f0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c300: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
c310: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   */.  int i;.  f
c320: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
c330: 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
c340: 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c  t( p->apCsr==0 |
c350: 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  | p->apCsr[i]==0
c360: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
c370: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
c380: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d  assert( p->aMem=
c390: 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d  =0 || p->aMem[i]
c3a0: 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c  .flags==MEM_Null
c3b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   );.#endif..  sq
c3c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c3d0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
c3e0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
c3f0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
c400: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
c410: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
c420: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
c430: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
c440: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
c450: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
c460: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
c470: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
c480: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
c490: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
c4a0: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
c4b0: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
c4c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
c4d0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
c4e0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
c4f0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
c500: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
c510: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c520: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
c530: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
c540: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
c550: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
c560: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c570: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
c580: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
c590: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
c5a0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
c5b0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c5c0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
c5d0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
c5e0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
c5f0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
c600: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
c610: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
c620: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
c630: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
c640: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
c650: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
c660: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
c670: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
c680: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
c690: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
c6a0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
c6b0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
c6c0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
c6d0: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
c6e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
c6f0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
c700: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
c710: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
c720: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
c730: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
c740: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
c750: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
c760: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
c770: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
c780: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
c790: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
c7a0: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
c7b0: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
c7c0: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
c7d0: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
c7e0: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
c7f0: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
c800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
c810: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
c820: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
c830: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
c840: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
c850: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
c860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
c870: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
c880: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
c890: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
c8a0: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
c8b0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8d0: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
c8e0: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
c8f0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c910: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
c920: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
c930: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c950: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
c960: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
c970: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
c980: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9a0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
c9b0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
c9c0: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
c9d0: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
c9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
c9f0: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
ca00: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
ca10: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
ca20: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
ca30: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
ca40: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
ca50: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
ca60: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
ca70: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
ca80: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
ca90: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
caa0: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
cab0: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
cac0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
cad0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
cae0: 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
caf0: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
cb00: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
cb10: 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
cb20: 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
cb30: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
cb40: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
cb50: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
cb60: 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
cb70: 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
cb80: 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
cb90: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
cba0: 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
cbb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
cbc0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
cbd0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
cbe0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
cbf0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
cc00: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
cc10: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
cc20: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
cc30: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
cc40: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
cc50: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
cc60: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
cc70: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
cc80: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
cc90: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
cca0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
ccb0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
ccc0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
ccd0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
cce0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
ccf0: 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
cd00: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
cd10: 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
cd20: 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
cd30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
cd40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
cd50: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
cd60: 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
cd70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cd80: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
cd90: 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
cda0: 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
cdb0: 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
cdc0: 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
cdd0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
cde0: 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
cdf0: 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
ce00: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
ce10: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
ce20: 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
ce30: 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
ce40: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
ce50: 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
ce60: 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
ce70: 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
ce80: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
ce90: 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
cea0: 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
ceb0: 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
cec0: 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
ced0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
cee0: 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
cef0: 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
cf00: 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
cf10: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
cf20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
cf30: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
cf40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
cf50: 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45  bSync(db, &p->zE
cf60: 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  rrMsg);..  /* Th
cf70: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
cf80: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
cf90: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
cfa0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
cfb0: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
cfc0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
cfd0: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
cfe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
cff0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
d000: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
d010: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
d020: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
d030: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
d040: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
d050: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
d060: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
d070: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
d080: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
d090: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
d0a0: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
d0b0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
d0c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d0d0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d0e0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
d0f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d100: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
d110: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
d120: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
d130: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
d140: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
d150: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
d160: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
d170: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
d180: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
d190: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 7d  ger(pBt));.    }
d1a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
d1b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d1c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
d1d0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
d1e0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
d1f0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
d200: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
d210: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
d220: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
d230: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d240: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
d250: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
d260: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
d270: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
d280: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d290: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d2a0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
d2b0: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
d2c0: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
d2d0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
d2e0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
d2f0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
d300: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
d310: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
d320: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
d330: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
d340: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d350: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
d360: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
d370: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
d380: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
d390: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
d3a0: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
d3b0: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
d3c0: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
d3d0: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
d3e0: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
d3f0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
d400: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
d410: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
d420: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
d430: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
d440: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
d450: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
d460: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
d470: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
d480: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
d490: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
d4a0: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
d4b0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
d4c0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
d4d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
d4e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d4f0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
d500: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
d510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d520: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
d530: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
d540: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
d550: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
d560: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
d570: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
d580: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
d590: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
d5a0: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
d5b0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
d5c0: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
d5d0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
d5e0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
d5f0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
d600: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
d610: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
d620: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
d630: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
d640: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
d650: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
d660: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
d670: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
d680: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
d690: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d6a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
d6b0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
d6c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
d6d0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
d6e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
d6f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d700: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
d710: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
d720: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
d730: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d740: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
d750: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
d760: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
d770: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
d780: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
d790: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
d7a0: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
d7b0: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
d7c0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d7d0: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
d7e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d7f0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
d800: 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a  ed atomicly..  *
d810: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d820: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
d830: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d840: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
d850: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
d860: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
d870: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
d880: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
d890: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
d8a0: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
d8b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
d8c0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
d8d0: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
d8e0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
d8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
d900: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
d910: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
d920: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
d930: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
d940: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d950: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
d960: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
d970: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
d980: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d990: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
d9a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
d9b0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
d9c0: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
d9d0: 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20  ;.      zMaster 
d9e0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d9f0: 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22  (db, "%s-mj%08X"
da00: 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61  , zMainFile, iRa
da10: 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 29  ndom&0x7fffffff)
da20: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
da30: 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ster ){.        
da40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
da50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
da60: 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
da70: 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
da80: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
da90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
daa0: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
dab0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
dac0: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
dad0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
dae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
daf0: 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
db00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db10: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
db20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
db30: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
db40: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
db50: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
db60: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
db70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
db80: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
db90: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
dba0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
dbb0: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
dbc0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
dbd0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
dbe0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
dbf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dc00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
dc10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
dc20: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
dc30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
dc40: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
dc50: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
dc60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
dc70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dc80: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
dc90: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
dca0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
dcb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
dcc0: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
dcd0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
dce0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
dcf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
dd00: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
dd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
dd20: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
dd30: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
dd40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
dd50: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
dd60: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
dd70: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
dd80: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
dd90: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
dda0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
ddb0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
ddc0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ddd0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
dde0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
ddf0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
de00: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
de10: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
de20: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
de30: 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
de40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
de50: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
de60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
de70: 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
de80: 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
de90: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
dea0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
deb0: 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
dec0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e  ;.        if( !n
ded0: 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69  eedSync && !sqli
dee0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
def0: 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20  bled(pBt) ){.   
df00: 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
df10: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
df20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
df30: 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
df40: 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
df50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
df60: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
df70: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
df80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
df90: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
dfa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dfb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
dfc0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
dfd0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
dfe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
dff0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e000: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
e010: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e020: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e030: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
e040: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
e050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e060: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
e070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e080: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
e090: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
e0a0: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
e0b0: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
e0c0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
e0d0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
e0e0: 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d  ync .     && 0==
e0f0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
e100: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
e110: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
e120: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
e130: 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
e140: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
e150: 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
e160: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
e170: 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
e180: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
e190: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
e1a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
e1b0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
e1c0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
e1d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e1e0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
e210: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
e220: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
e230: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
e240: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
e250: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
e260: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
e270: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
e280: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
e290: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
e2a0: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
e2b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
e2c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e2d0: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
e2e0: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
e2f0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
e300: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e310: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
e320: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
e330: 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
e340: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
e350: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
e360: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e370: 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
e380: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
e390: 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
e3a0: 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
e3b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e3c0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
e3d0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e3e0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
e3f0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
e400: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
e410: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
e420: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e430: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e440: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
e450: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e460: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e470: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e490: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
e4a0: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
e4b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e4c0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e4d0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
e4e0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e4f0: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
e500: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e510: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
e520: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e530: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e540: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e550: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
e560: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e570: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
e580: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
e590: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
e5a0: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
e5b0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
e5c0: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
e5d0: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
e5e0: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
e5f0: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
e600: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
e610: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e620: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e630: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
e640: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e650: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
e660: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
e670: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e680: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
e690: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
e6a0: 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
e6b0: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
e6c0: 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
e6d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
e6e0: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
e6f0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e700: 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
e710: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
e720: 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
e730: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
e740: 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
e750: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
e760: 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
e770: 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
e780: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
e790: 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
e7a0: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
e7b0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
e7c0: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
e7d0: 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
e7e0: 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
e7f0: 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
e800: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
e810: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
e820: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
e830: 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
e840: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
e850: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
e860: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
e870: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
e880: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
e890: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
e8a0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
e8b0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e8c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e8d0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e8f0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e900: 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
e910: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
e920: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
e930: 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
e940: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
e950: 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
e960: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
e970: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
e980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e990: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
e9a0: 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
e9b0: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69  the sqlite3.acti
e9c0: 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20  veVdbeCnt count 
e9d0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
e9e0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
e9f0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
ea00: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
ea10: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
ea20: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
ea30: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
ea40: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
ea50: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
ea60: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
ea70: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
ea80: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
ea90: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
eaa0: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
eab0: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
eac0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
ead0: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
eae0: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
eaf0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
eb00: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
eb10: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
eb20: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
eb30: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
eb40: 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
eb50: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
eb60: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
eb70: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
eb80: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
eb90: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
eba0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
ebb0: 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
ebc0: 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
ebd0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
ebe0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
ebf0: 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61  sert( cnt==db->a
ec00: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a  ctiveVdbeCnt );.
ec10: 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
ec20: 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  ==db->writeVdbeC
ec30: 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  nt );.}.#else.#d
ec40: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
ec50: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
ec60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76  if../*.** For ev
ec70: 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69  ery Btree that i
ec80: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
ec90: 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a  ction db which .
eca0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
ecb0: 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20  fied, "trip" or 
ecc0: 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20  invalidate each 
ecd0: 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61  cursor in.** tha
ece0: 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61  t Btree might ha
ecf0: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
ed00: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72   so that the cur
ed10: 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72  sor.** can never
ed20: 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20   be used again. 
ed30: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
ed40: 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  en a rollback.**
ed50: 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61  * occurs.  We ha
ed60: 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74  ve to trip all t
ed70: 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  he other cursors
ed80: 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  , even.** cursor
ed90: 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20   from other VMs 
eda0: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74  in different dat
edb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
edc0: 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f  s,.** so that no
edd0: 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74  ne of them try t
ede0: 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61  o use the data a
edf0: 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  t which they.** 
ee00: 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e  were pointing an
ee10: 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20  d which now may 
ee20: 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65  have been change
ee30: 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20  d due.** to the 
ee40: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
ee50: 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20  Remember that a 
ee60: 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c  rollback can del
ee70: 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c  ete tables compl
ee80: 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64  ete and.** reord
ee90: 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53  er rootpages.  S
eea0: 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
eeb0: 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73  icient just to s
eec0: 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  ave.** the state
eed0: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
eee0: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61   We have to inva
eef0: 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f  lidate the curso
ef00: 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  r.** so that it 
ef10: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67  is never used ag
ef20: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
ef30: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75  oid invalidateCu
ef40: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
ef50: 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64  trees(sqlite3 *d
ef60: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  b){.  int i;.  f
ef70: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
ef80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
ef90: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
efa0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
efb0: 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  p && sqlite3Btre
efc0: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
efd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
efe0: 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
eff0: 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  s(p, SQLITE_ABOR
f000: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
f010: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
f020: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
f030: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
f040: 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
f050: 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
f060: 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
f070: 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
f080: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
f090: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f0a0: 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
f0b0: 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
f0c0: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
f0d0: 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
f0e0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
f0f0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
f100: 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
f110: 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
f120: 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
f130: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
f140: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74  saction is commt
f150: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
f160: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f170: 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
f180: 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
f190: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
f1a0: 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
f1b0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
f1c0: 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
f1d0: 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
f1e0: 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
f1f0: 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
f200: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
f210: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
f220: 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
f230: 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
f240: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
f250: 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
f260: 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
f270: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
f280: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
f290: 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
f2a0: 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
f2b0: 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
f2c0: 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
f2d0: 6f 63 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67  occured, causing
f2e0: 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
f2f0: 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
f300: 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
f310: 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
f320: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
f330: 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
f340: 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
f350: 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
f360: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
f370: 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
f380: 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
f390: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
f3a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
f3b0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f3c0: 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
f3d0: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
f3e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
f3f0: 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
f400: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f410: 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
f420: 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
f430: 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
f440: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f450: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
f460: 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
f470: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f480: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f490: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f4a0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f4b0: 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
f4c0: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
f4e0: 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
f4f0: 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
f500: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f510: 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
f520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f530: 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
f540: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f550: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
f560: 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
f570: 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
f580: 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
f590: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f5a0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f5b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f5c0: 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
f5d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
f5f0: 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
f600: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
f610: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
f620: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f630: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f640: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f650: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f660: 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
f670: 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
f680: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
f690: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
f6a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
f6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f6c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f6d0: 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
f6e0: 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
f6f0: 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
f700: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f710: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
f720: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f730: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
f740: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
f750: 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
f760: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
f770: 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
f780: 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
f790: 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
f7a0: 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
f7b0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
f7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
f7d0: 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
f7e0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f7f0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f800: 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
f810: 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
f820: 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d  mtDefCons;.    }
f830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f850: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
f860: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
f870: 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
f880: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
f890: 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
f8a0: 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
f8b0: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
f8c0: 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
f8d0: 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
f8e0: 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
f8f0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
f900: 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
f910: 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
f920: 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
f930: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
f940: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
f950: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
f960: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
f970: 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
f980: 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
f990: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
f9a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
f9b0: 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
f9c0: 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
f9d0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
f9e0: 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72   write.** an err
f9f0: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
fa00: 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
fa10: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
fa20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fa30: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
fa40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
fa50: 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
fa60: 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
fa70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
fa80: 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
fa90: 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66  rred && db->nDef
faa0: 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20  erredCons>0) || 
fab0: 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
fac0: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
fad0: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
fae0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
faf0: 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  NT;.    p->error
fb00: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
fb10: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
fb20: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
fb30: 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67  Msg, db, "foreig
fb40: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
fb50: 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
fb60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fb70: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
fb80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
fb90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fba0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
fbb0: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
fbc0: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
fbd0: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
fbe0: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
fbf0: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
fc00: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
fc10: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
fc20: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
fc30: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
fc40: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
fc50: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
fc60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
fc70: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
fc80: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
fc90: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
fca0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
fcb0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
fcc0: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
fcd0: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
fce0: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
fcf0: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
fd00: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
fd10: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
fd20: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
fd30: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
fd40: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
fd50: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
fd60: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
fd70: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
fd80: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
fd90: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
fda0: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
fdb0: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
fdc0: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
fdd0: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
fde0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
fdf0: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
fe00: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
fe30: 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
fe40: 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
fe50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
fe60: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
fe70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
fe80: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
fe90: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
fea0: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
feb0: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
fec0: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
fed0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
fee0: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
fef0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
ff00: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
ff10: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
ff20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
ff30: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
ff40: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
ff50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
ff60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
ff70: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
ff80: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
ff90: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
ffa0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
ffb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
ffc0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
ffd0: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
ffe0: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
fff0: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
10000 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
10010 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
10020 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10030 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
10040 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
10050 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
10060 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
10070 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
10080 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
10090 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
100a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
100b0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
100c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
100d0 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
100e0 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
100f0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
10100 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
10110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10120 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
10130 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
10140 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
10150 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
10160 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
10170 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ver started */. 
10180 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
10190 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
101a0 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
101b0 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
101c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
101d0 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
101e0 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
101f0 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
10200 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
10210 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
10220 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
10230 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
10240 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
10250 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
10260 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
10270 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
10280 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
10290 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
102a0 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
102b0 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73   & 0xff;.    ass
102c0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
102d0 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
102e0 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72   );  /* This err
102f0 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69  or no longer exi
10300 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65  sts */.    isSpe
10310 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
10320 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
10330 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
10340 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
10350 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
10360 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
10370 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
10380 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
10390 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
103a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
103b0 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
103c0 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
103d0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
103e0 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
103f0 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
10400 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
10410 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
10420 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
10430 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
10440 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
10450 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
10460 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
10470 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
10480 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
10490 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
104a0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
104b0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
104c0 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
104d0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
104e0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
104f0 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
10500 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
10510 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
10520 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
10530 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c 65  ** occured while
10540 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
10550 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
10560 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
10570 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
10580 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
10590 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
105a0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
105b0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
105c0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
105d0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
105e0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
105f0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
10600 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
10610 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
10620 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
10630 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
10640 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
10650 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
10660 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
10670 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
10680 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
10690 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
106a0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
106b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
106c0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
106d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
106e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
106f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
10700 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
10710 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
10720 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
10730 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
10740 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
10750 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
10760 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
10770 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
10780 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
10790 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
107a0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
107b0 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
107c0 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
107d0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
107e0 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
107f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
10800 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
10810 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
10820 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
10830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10840 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10850 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
10860 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
10870 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
10880 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
108a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
108b0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
108c0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
108d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
108e0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
108f0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
10900 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
10910 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
10920 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
10930 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
10940 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
10950 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
10960 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
10970 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
10980 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
10990 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
109a0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
109b0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
109c0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
109d0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
109e0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
109f0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
10a00 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
10a10 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d  b->writeVdbeCnt=
10a20 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  =(p->readOnly==0
10a30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
10a40 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10a50 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
10a60 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
10a70 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
10a80 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
10a90 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10aa0 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20  CheckFk(p, 1);. 
10ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10ad0 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
10ae0 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  p->readOnly) ){.
10af0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10b00 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
10b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
10b20 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10b30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10b50 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
10b60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
10b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10b80 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10b90 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
10ba0 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
10bb0 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
10bc0 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
10bd0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
10be0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
10bf0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
10c00 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
10c10 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
10c20 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
10c30 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
10c40 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
10c50 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
10c60 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
10c70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
10c80 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
10c90 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
10ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10cb0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
10cc0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
10cd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10ce0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
10cf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10d00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
10d10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
10d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10d30 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
10d40 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
10d50 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10d60 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
10d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10d80 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10d90 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10da0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
10db0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
10dc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10de0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10df0 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
10e00 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
10e10 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
10e20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
10e30 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
10e40 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10e50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
10e60 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
10e70 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
10e80 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10e90 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
10ea0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10eb0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
10ec0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
10ed0 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
10ee0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
10ef0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
10f00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61  se{.        inva
10f10 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
10f20 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 62  odifiedBtrees(db
10f30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10f40 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
10f50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10f60 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
10f70 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
10f80 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10f90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10fa0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
10fb0 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
10fc0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
10fd0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10fe0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
10ff0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
11000 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
11010 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
11020 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
11030 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
11040 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
11050 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
11060 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
11070 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
11080 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
11090 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
110a0 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
110b0 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
110c0 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
110d0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
110e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
110f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
11100 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
11110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11120 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
11130 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
11140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
11150 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11160 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11170 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
11180 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
11190 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
111a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
111b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
111c0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
111d0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
111e0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
111f0 7d 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  }.        invali
11200 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
11210 69 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b  ifiedBtrees(db);
11220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11230 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
11240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11250 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
11260 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
11270 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
11280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11290 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
112a0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
112b0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
112c0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
112d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
112e0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
112f0 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
11300 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
11310 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
11320 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
11330 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
11340 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
11350 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
11360 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
11370 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
11380 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
11390 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
113a0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
113b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
113c0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
113d0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
113e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
113f0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
11400 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61    .    /* Rollba
11410 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79  ck or commit any
11420 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
11430 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a  that occurred. *
11440 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21  /.    if( p->rc!
11450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62  =SQLITE_OK && db
11460 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
11470 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a  nternChanges ){.
11480 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
11490 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
114a0 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  (db, -1);.      
114b0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d  db->flags = (db-
114c0 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f  >flags | SQLITE_
114d0 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a  InternChanges);.
114e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
114f0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
11500 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
11510 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
11520 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
11530 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
11540 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
11550 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
11560 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
11570 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11580 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
11590 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
115a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
115b0 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
115c0 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
115d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
115e0 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
115f0 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
11600 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
11610 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
11620 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
11630 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
11640 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
11650 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
11660 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11670 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
11680 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
11690 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
116a0 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
116b0 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
116c0 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
116d0 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
116e0 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
116f0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
11700 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
11710 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
11720 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
11730 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
11740 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
11750 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
11760 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
11770 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11780 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
11790 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
117a0 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64  veVdbeCnt>0 || d
117b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
117c0 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
117d0 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
117e0 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
117f0 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
11800 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
11810 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
11820 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
11830 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
11840 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
11850 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
11860 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
11870 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
11880 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
11890 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
118a0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
118b0 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
118c0 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
118d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
118e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
118f0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
11900 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
11910 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
11920 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
11930 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
11940 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
11950 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
11960 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
11970 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
11980 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
11990 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
119a0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
119b0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
119c0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
119d0 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
119e0 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
119f0 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
11a00 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
11a10 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11a30 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
11a40 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
11a50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11a60 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
11a70 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
11a80 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20  rrMsg ){.    u8 
11a90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64  mallocFailed = d
11aa0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
11ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11ac0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
11ae0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
11af0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
11b00 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
11b10 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
11b30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11b40 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
11b50 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
11b60 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
11b70 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
11b80 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
11b90 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
11ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
11bc0 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11bd0 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11be0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11bf0 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11c00 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11c10 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11c20 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11c30 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
11c40 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
11c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11c60 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
11c70 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
11c80 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
11c90 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
11ca0 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
11cb0 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11cc0 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11cd0 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11ce0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11cf0 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11d00 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11d10 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11d20 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11d30 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
11d40 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
11d50 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
11d60 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
11d70 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
11d80 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
11d90 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
11da0 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
11db0 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
11dc0 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
11dd0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
11de0 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
11df0 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
11e00 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
11e10 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
11e20 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
11e30 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
11e40 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
11e50 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
11e60 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
11e70 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
11e80 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
11e90 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
11ea0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
11eb0 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
11ec0 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
11ed0 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
11ee0 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
11ef0 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
11f00 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
11f10 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
11f20 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11f30 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
11f40 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
11f50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11f60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11f70 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
11f80 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
11f90 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
11fa0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
11fb0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
11fc0 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
11fd0 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
11fe0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
11ff0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
12000 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
12010 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
12020 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
12030 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
12040 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
12050 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
12060 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
12070 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
12080 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
12090 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
120a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
120b0 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
120c0 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
120d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
120e0 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
120f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12100 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
12110 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
12120 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
12130 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
12150 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
12160 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
12170 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
12180 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
12190 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
121a0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
121b0 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
121c0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
121d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
121e0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
121f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
12200 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
12210 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
12220 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
12230 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
12240 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
12250 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
12260 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
12270 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
12280 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
12290 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
122a0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
122b0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
122c0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
122d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
122e0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
122f0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
12300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
12310 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
12320 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
12330 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
12340 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
12350 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
12360 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
12370 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
12380 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
12390 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
123a0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
123b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
123c0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
123d0 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
123e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
123f0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
12400 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
12410 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12420 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
12430 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
12440 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
12450 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
12460 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
12470 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
12480 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
12490 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
124a0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
124b0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
124c0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
124d0 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
124e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
124f0 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
12500 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
12520 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
12530 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
12540 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
12550 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
12560 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
12570 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
12580 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
12590 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
125a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
125b0 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
125c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
125d0 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   Call the destru
125e0 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75  ctor for each au
125f0 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70  xdata entry in p
12600 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69  VdbeFunc for whi
12610 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  ch.** the corres
12620 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d  ponding bit in m
12630 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41  ask is clear.  A
12640 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62  uxdata entries b
12650 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20  eyond 31.** are 
12660 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64  always destroyed
12670 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c  .  To destroy al
12680 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65  l auxdata entrie
12690 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  s, call this.** 
126a0 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73  routine with mas
126b0 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  k==0..*/.void sq
126c0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
126d0 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20  uxData(VdbeFunc 
126e0 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20  *pVdbeFunc, int 
126f0 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mask){.  int i;.
12700 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64    for(i=0; i<pVd
12710 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b  beFunc->nAux; i+
12720 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41  +){.    struct A
12730 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26  uxData *pAux = &
12740 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78  pVdbeFunc->apAux
12750 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e  [i];.    if( (i>
12760 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28  31 || !(mask&(((
12770 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20  u32)1)<<i))) && 
12780 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
12790 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
127a0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
127b0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
127c0 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
127d0 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
127e0 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
127f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
12800 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
12810 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12820 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12830 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12840 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66  ent..** The diff
12850 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
12860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
12870 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12880 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
12890 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
128a0 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
128b0 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
128c0 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
128d0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
128e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
128f0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
12900 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a  te3VdbeDeleteObj
12910 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
12920 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
12930 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
12940 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pNext;.  int i;.
12950 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
12960 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
12970 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
12980 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
12990 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
129a0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
129b0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
129c0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
129d0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
129e0 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
129f0 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
12a00 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
12a10 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
12a20 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
12a30 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
12a40 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
12a50 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
12a60 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  .  }.  for(i=p->
12a70 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nzVar-1; i>=0; i
12a80 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  --) sqlite3DbFre
12a90 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69  e(db, p->azVar[i
12aa0 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  ]);.  vdbeFreeOp
12ab0 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
12ac0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
12ad0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12ae0 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  ->aLabel);.  sql
12af0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12b00 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
12b10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12b20 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c   p->zSql);.  sql
12b30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12b40 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69  ->pFree);.  sqli
12b50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
12b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
12b70 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
12b80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12b90 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
12ba0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
12bb0 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  *db;..  if( NEVE
12bc0 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
12bd0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
12be0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
12bf0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
12c00 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
12c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
12c20 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
12c30 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
12c40 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
12c50 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
12c60 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
12c70 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
12c80 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
12c90 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
12ca0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
12cb0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56   = 0;.  sqlite3V
12cc0 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28  dbeDeleteObject(
12cd0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
12ce0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
12cf0 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
12d00 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
12d10 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
12d20 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
12d30 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
12d40 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
12d50 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
12d60 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
12d70 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
12d80 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
12d90 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
12da0 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
12db0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
12dc0 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
12dd0 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
12de0 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
12df0 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
12e00 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
12e10 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
12e20 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
12e30 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
12e40 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
12e50 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
12e60 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
12e70 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
12e80 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
12e90 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
12ea0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
12eb0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
12ec0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
12ed0 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
12ee0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
12ef0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
12f00 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
12f10 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
12f20 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
12f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12f40 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
12f50 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
12f60 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
12f70 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
12f80 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
12f90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12fa0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
12fb0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
12fc0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  unt;.#endif.    
12fd0 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
12fe0 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  le );.    rc = s
12ff0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
13000 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
13010 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
13020 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
13030 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  s);.    if( rc )
13040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13050 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  p->lastRowid = p
13060 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
13070 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29      if( res!=0 )
13080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13090 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
130a0 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
130b0 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
130c0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c  ITE_TEST.    sql
130d0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
130e0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t++;.#endif.    
130f0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
13100 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61  o = 0;.    p->ca
13110 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
13120 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65  E_STALE;.  }else
13130 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70   if( ALWAYS(p->p
13140 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69  Cursor) ){.    i
13150 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
13160 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
13170 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
13180 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
13190 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
131a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
131b0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
131c0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
131d0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
131e0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
131f0 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
13200 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
13210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
13230 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
13240 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
13250 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
13260 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
13270 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
13280 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13290 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
132a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
132b0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
132c0 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
132d0 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
132e0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
132f0 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
13300 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
13310 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
13320 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
13330 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
13340 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
13350 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
13360 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
13370 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
13380 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
13390 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
133a0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
133b0 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
133c0 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
133d0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
133e0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
133f0 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
13400 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
13410 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
13420 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
13430 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
13440 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
13450 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
13460 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
13470 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
13480 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
13490 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
134a0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
134b0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
134c0 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
134d0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
134e0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
134f0 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
13500 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
13510 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
13520 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
13530 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
13540 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
13550 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
13560 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
13570 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
13580 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
13590 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
135b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
135c0 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
135e0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
135f0 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
13610 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13620 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13630 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
13640 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
13650 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13660 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
13690 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
136a0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
136b0 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
136c0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
136d0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
13700 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
13710 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
13730 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
13740 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
13750 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
13760 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
13770 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
13780 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
137a0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
137b0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
137c0 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
137e0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
137f0 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
13800 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
13830 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
13840 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
13850 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
13860 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
13870 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
13880 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
13890 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
138a0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
138b0 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
138c0 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
138d0 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
138e0 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
138f0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
13900 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
13910 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
13920 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
13930 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
13940 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
13950 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
13960 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
13970 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
13980 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
13990 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
139a0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
139b0 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
139c0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
139d0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
139e0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
139f0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
13a00 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
13a10 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
13a20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
13a30 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
13a40 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
13a50 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
13a60 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
13a70 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
13a80 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
13a90 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
13aa0 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
13ab0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13ac0 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a  8+(u32)i;.    }.
13ad0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
13ae0 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58       if( i<(-MAX
13af0 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e  _6BYTE) ) return
13b00 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65   6;.      /* Pre
13b10 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65  vious test preve
13b20 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32  nts:  u = -(-922
13b30 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
13b40 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d  ) */.      u = -
13b50 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
13b60 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
13b70 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
13b80 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
13b90 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
13ba0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
13bb0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
13bc0 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
13bd0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
13be0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
13bf0 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
13c00 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
13c10 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
13c20 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
13c30 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
13c40 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
13c50 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
13c60 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
13c70 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
13c80 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
13c90 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
13ca0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
13cb0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
13cc0 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73  .nZero;.  }.  as
13cd0 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
13ce0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
13cf0 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
13d00 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
13d10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13d20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
13d30 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
13d40 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
13d50 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
13d60 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13d70 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
13d80 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
13d90 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
13da0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
13db0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
13dc0 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
13dd0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
13de0 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
13df0 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
13e00 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
13e10 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
13e20 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
13e30 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
13e40 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
13e50 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
13e60 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
13e70 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
13e80 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
13e90 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
13ea0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
13eb0 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
13ec0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
13ed0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
13ee0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
13ef0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
13f00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13f10 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
13f20 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
13f30 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
13f40 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
13f50 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
13f60 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
13f70 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
13f80 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
13f90 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
13fa0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
13fb0 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
13fc0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
13fd0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
13fe0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
13ff0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
14000 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
14010 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
14020 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
14030 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
14040 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
14050 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
14060 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
14070 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
14080 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
14090 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
140a0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
140b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
140c0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
140d0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
140e0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
140f0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
14100 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
14110 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
14120 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
14130 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
14140 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
14150 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
14160 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
14170 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
14180 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
14190 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
141a0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
141b0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
141c0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
141d0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
141e0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
141f0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
14200 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
14210 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
14220 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
14230 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
14240 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
14250 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
14260 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
14270 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
14280 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
14290 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
142a0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
142b0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
142c0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
142d0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
142e0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
142f0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
14300 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
14310 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
14320 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
14330 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
14340 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
14350 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
14360 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
14370 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
14380 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
14390 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
143a0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
143b0 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
143c0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
143d0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
143e0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
143f0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
14400 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
14410 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
14420 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
14430 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
14440 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
14450 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
14460 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
14470 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
14480 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
14490 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
144a0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
144b0 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
144c0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
144d0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
144e0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
144f0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
14500 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
14510 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
14520 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
14530 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
14540 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
14550 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
14560 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
14570 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
14580 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
14590 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
145a0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
145b0 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
145c0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
145d0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
145e0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
145f0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
14600 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
14610 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
14620 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
14630 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
14640 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
14650 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
14660 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
14670 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
14680 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14690 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
146a0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
146b0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
146c0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
146d0 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
146e0 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
146f0 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14700 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
14710 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
14720 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
14730 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
14740 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
14750 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
14760 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
14770 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
14780 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
14790 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
147a0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
147b0 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
147c0 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
147d0 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
147e0 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
147f0 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
14800 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
14810 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
14820 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
14830 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
14840 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
14850 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
14860 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
14870 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
14880 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
14890 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
148a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
148b0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
148c0 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
148d0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
148e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
148f0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14900 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
14910 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
14920 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
14930 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
14940 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
14950 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
14960 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
14970 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
14980 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
14990 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
149a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
149b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
149c0 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
149d0 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20  _format);.  u32 
149e0 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
149f0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
14a00 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14a10 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
14a20 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
14a30 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
14a40 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14a50 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
14a60 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
14a70 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
14a80 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
14a90 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
14aa0 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
14ab0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14ac0 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
14ad0 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
14ae0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
14af0 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
14b00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
14b10 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
14b20 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
14b30 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20   len<=(u32)nBuf 
14b40 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
14b50 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
14b60 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
14b70 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
14b80 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14b90 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14ba0 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
14bb0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
14bc0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
14bd0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
14be0 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
14bf0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
14c00 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
14c10 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
14c20 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
14c30 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
14c40 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
14c50 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
14c60 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
14c70 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
14c80 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
14c90 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
14ca0 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
14cb0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
14cc0 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
14cd0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73  .nZero;.      as
14ce0 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b  sert( nBuf>=0 );
14cf0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e  .      if( len >
14d00 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20   (u32)nBuf ){.  
14d10 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32        len = (u32
14d20 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20  )nBuf;.      }. 
14d30 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
14d40 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
14d50 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
14d60 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14d70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
14d80 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
14d90 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
14da0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
14db0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
14dc0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
14dd0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
14de0 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
14df0 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
14e00 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
14e10 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
14e20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
14e30 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73   read..*/ .u32 s
14e40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14e50 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
14e60 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
14e70 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
14e80 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
14e90 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
14ea0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
14eb0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
14ec0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
14ed0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
14ee0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
14ef0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
14f00 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
14f10 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
14f20 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
14f30 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
14f40 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
14f50 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
14f60 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
14f70 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
14f80 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
14f90 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
14fa0 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
14fb0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14fc0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
14fd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14fe0 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
14ff0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
15000 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
15010 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
15020 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
15030 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15040 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15050 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
15060 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
15070 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
15080 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15090 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
150a0 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
150b0 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
150c0 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
150d0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
150e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
150f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
15100 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
15110 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
15120 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15130 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
15140 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
15150 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
15160 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
15170 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15180 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15190 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
151a0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
151b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
151c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
151d0 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
151e0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
151f0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
15200 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
15210 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15220 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15230 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
15240 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
15250 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
15260 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
15270 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
15280 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
15290 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
152a0 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
152b0 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
152c0 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
152d0 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
152e0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
152f0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
15300 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
15310 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15320 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15330 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
15340 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
15350 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
15360 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15370 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
15380 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
15390 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
153a0 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
153b0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
153c0 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
153d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
153e0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
153f0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
15400 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
15410 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
15420 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
15430 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
15440 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
15450 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
15460 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
15470 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
15480 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
15490 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
154a0 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
154b0 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
154c0 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
154d0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
154e0 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
154f0 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
15500 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
15510 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
15520 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
15530 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
15540 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
15550 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
15560 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15570 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
15580 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
15590 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
155a0 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )==0 );.#endif..
155b0 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
155c0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
155d0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
155e0 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
155f0 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
15600 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
15610 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
15620 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
15630 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
15640 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
15650 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
15660 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
15670 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
15680 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15690 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
156a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
156b0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
156c0 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
156d0 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a  (pMem->r)==8 );.
156e0 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65          swapMixe
156f0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
15700 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
15710 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69  &pMem->r, &x, si
15720 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
15730 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15740 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
15750 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  m->r) ? MEM_Null
15760 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   : MEM_Real;.   
15770 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15780 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
15790 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
157a0 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
157b0 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
157c0 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
157d0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
157e0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
157f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15800 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
15810 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
15820 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
15830 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
15840 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
15850 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
15860 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
15870 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
15880 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
15890 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
158a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
158b0 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
158c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
158d0 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
158e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
158f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15900 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
15910 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
15920 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
15930 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
15940 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15960 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
15970 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
15980 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
15990 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
159a0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
159b0 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
159c0 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
159d0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
159e0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
159f0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
15a00 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
15a10 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
15a20 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
15a30 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
15a40 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
15a50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15a60 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
15a70 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
15a80 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
15a90 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
15aa0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
15ab0 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
15ac0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
15ad0 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
15ae0 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
15af0 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
15b00 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
15b10 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
15b20 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
15b30 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
15b40 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
15b50 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
15b60 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
15b70 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
15b80 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
15b90 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
15ba0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
15bb0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
15bc0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
15bd0 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
15be0 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
15bf0 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
15c00 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
15c10 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
15c20 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
15c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
15c40 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
15c50 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
15c60 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
15c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
15c80 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
15c90 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
15ca0 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15cc0 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
15cd0 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
15ce0 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
15d10 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
15d20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
15d30 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15d40 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15d50 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
15d60 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
15d70 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
15da0 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
15db0 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
15dc0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15df0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
15e00 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
15e10 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
15e20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
15e30 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
15e40 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
15e50 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
15e60 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
15e70 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
15e80 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
15e90 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
15ea0 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
15eb0 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
15ec0 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
15ed0 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
15ee0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
15ef0 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
15f00 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
15f10 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
15f20 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
15f30 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
15f40 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
15f50 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
15f60 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
15f70 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
15f80 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
15f90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
15fa0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
15fb0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
15fc0 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
15fd0 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
15fe0 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
15ff0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
16000 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
16010 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
16020 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
16030 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
16040 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
16050 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
16060 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
16070 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
16080 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
16090 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
160a0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
160b0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
160c0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
160d0 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
160e0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
160f0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
16100 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
16110 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
16120 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
16130 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
16140 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
16150 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
16160 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
16170 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
16180 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16190 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
161a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
161b0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
161c0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
161d0 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
161e0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
161f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
16200 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
16210 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
16220 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
16230 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
16240 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
16250 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
16260 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
16270 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
16280 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
16290 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
162a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
162b0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
162c0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
162d0 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
162e0 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16300 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
16310 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
16320 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
16350 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
16360 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
16370 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
16380 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20  em;..  p->flags 
16390 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
163a0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
163b0 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
163c0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
163d0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
163e0 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
163f0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
16400 78 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e  x<szHdr && u<p->
16410 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65  nField && d<=nKe
16420 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
16430 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
16440 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
16450 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
16460 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
16470 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
16480 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
16490 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
164a0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
164b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
164c0 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
164d0 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
164e0 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
164f0 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  /.    pMem->zMal
16500 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
16510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
16520 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
16530 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
16540 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
16550 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
16560 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
16570 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
16580 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
16590 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   u;.}../*.** Thi
165a0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
165b0 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
165c0 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
165d0 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
165e0 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
165f0 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
16600 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
16610 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
16620 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
16630 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
16640 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
16650 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
16660 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
16670 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
16680 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
16690 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
166a0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
166b0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
166c0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
166d0 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
166e0 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
166f0 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
16700 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
16710 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
16720 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
16730 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
16740 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
16750 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16760 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20   fields..** The 
16770 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66  key with fewer f
16780 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79  ields is usually
16790 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74   compares less t
167a0 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67  han the .** long
167b0 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72  er key.  However
167c0 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
167d0 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69  _INCRKEY flags i
167e0 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a  n pPKey2 is set.
167f0 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  ** and the commo
16800 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65  n prefixes are e
16810 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20  qual, then key1 
16820 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79  is less than key
16830 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20  2..** Or if the 
16840 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50  UNPACKED_MATCH_P
16850 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65  REFIX flag is se
16860 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78  t and the prefix
16870 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c  es are.** equal,
16880 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61   then the keys a
16890 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
168a0 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a   be equal and.**
168b0 20 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e   the parts beyon
168c0 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
168d0 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  fix are ignored.
168e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e  .**.** If the UN
168f0 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
16900 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c  WID flag is set,
16910 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62   then the last b
16920 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65  yte of.** the he
16930 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73  ader of pKey1 is
16940 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73   ignored.  It is
16950 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b   assumed that pK
16960 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64  ey1 is.** an ind
16970 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73  ex key, and thus
16980 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77   ends with a row
16990 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c  id value.  The l
169a0 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  ast byte.** of t
169b0 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74  he header will t
169c0 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20  herefore be the 
169d0 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  serial type of t
169e0 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65  he rowid:.** one
169f0 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   of 1, 2, 3, 4, 
16a00 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20  5, 6, 8, or 9 - 
16a10 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69  the integer seri
16a20 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65  al types..** The
16a30 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
16a40 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
16a50 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61  will always be a
16a60 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a   single byte..**
16a70 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69   By ignoring thi
16a80 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74  s last byte of t
16a90 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f  he header, we fo
16aa0 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  rce the comparis
16ab0 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  on.** to ignore 
16ac0 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
16ad0 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f   end of key1..*/
16ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16af0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
16b00 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
16b10 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
16b20 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
16b30 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16b40 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
16b50 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
16b60 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20  .  int d1;      
16b70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
16b80 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
16b90 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
16ba0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
16bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
16bc0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
16bd0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
16be0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
16bf0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
16c00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16c10 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
16c20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
16c30 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72   nField;.  int r
16c40 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
16c50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
16c60 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
16c70 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
16c80 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
16c90 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
16ca0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
16cb0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
16cc0 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  nfo;.  mem1.enc 
16cd0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
16ce0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
16cf0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
16d00 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
16d10 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
16d20 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
16d30 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16d40 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
16d50 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
16d60 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
16d70 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
16d80 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
16d90 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
16da0 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
16db0 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
16dc0 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
16dd0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
16de0 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
16df0 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
16e00 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
16e10 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
16e20 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
16e30 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
16e40 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
16e50 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
16e60 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
16e70 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
16e80 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
16e90 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
16ea0 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
16eb0 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
16ec0 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
16ed0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16ee0 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
16ef0 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
16f00 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
16f10 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
16f20 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
16f30 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
16f40 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
16f50 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
16f60 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
16f70 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
16f80 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
16f90 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
16fa0 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
16fb0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
16fc0 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
16fd0 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79  dr1;.  if( pPKey
16fe0 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43  2->flags & UNPAC
16ff0 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44  KED_IGNORE_ROWID
17000 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d   ){.    szHdr1--
17010 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d  ;.  }.  nField =
17020 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
17030 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
17040 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
17050 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20  ey2->nField ){. 
17060 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
17070 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
17080 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
17090 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
170a0 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
170b0 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
170c0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
170d0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
170e0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
170f0 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
17100 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
17110 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
17120 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
17130 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
17140 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
17150 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
17160 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
17170 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17180 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
17190 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
171a0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
171b0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
171c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
171d0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
171e0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
171f0 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20         i<nField 
17220 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
17230 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
17240 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
17250 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
17260 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
17270 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
17280 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ow */..      /* 
17290 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
172a0 74 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  t if we are usin
172b0 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  g DESC sort orde
172c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  r. */.      if( 
172d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
172e0 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64  rder && i<nField
172f0 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
17300 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
17310 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
17320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  .      }.    .  
17330 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
17340 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
17350 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20   is set and all 
17360 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68  fields except th
17370 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  e final.      **
17380 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72   rowid field wer
17390 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c  e equal, then cl
173a0 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53  ear the PREFIX_S
173b0 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73  EARCH flag and s
173c0 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b  et .      ** pPK
173d0 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68  ey2->rowid to th
173e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72  e value of the r
173f0 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70  owid field in (p
17400 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20  Key1, nKey1)..  
17410 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
17420 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73  sed by the OP_Is
17430 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20  Unique opcode.. 
17440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
17450 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  ( (pPKey2->flags
17460 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
17470 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d  IX_SEARCH) && i=
17480 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  =(pPKey2->nField
17490 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  -1) ){.        a
174a0 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48  ssert( idx1==szH
174b0 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20  dr1 && rc );.   
174c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
174d0 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  1.flags & MEM_In
174e0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b  t );.        pPK
174f0 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55  ey2->flags &= ~U
17500 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53  NPACKED_PREFIX_S
17510 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70  EARCH;.        p
17520 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d  PKey2->rowid = m
17530 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  em1.u.i;.      }
17540 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75  .    .      retu
17550 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17560 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   i++;.  }..  /* 
17570 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
17580 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
17590 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
175a0 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
175b0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
175c0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
175d0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
175e0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
175f0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
17600 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
17610 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
17620 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
17630 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
17640 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d  ( mem1.zMalloc==
17650 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
17660 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
17670 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
17680 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
17690 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
176a0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
176b0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
176c0 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55   equal. If the U
176d0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a  NPACKED_INCRKEY.
176e0 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
176f0 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65  , then break the
17700 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67   tie by treating
17710 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e   key2 as larger.
17720 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41  .  ** If the UPA
17730 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43  CKED_PREFIX_MATC
17740 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  H flag is set, t
17750 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f  hen keys with co
17760 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20  mmon prefixes.  
17770 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ** are considere
17780 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20  d to be equal.  
17790 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
177a0 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65  onger key is the
177b0 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20   .  ** larger.  
177c0 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
177d0 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
177e0 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
177f0 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  ger.  ** if ther
17800 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63  e is a differenc
17810 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
17820 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ( rc==0 );.  if(
17830 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
17840 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
17850 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31  Y ){.    rc = -1
17860 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
17870 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
17880 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
17890 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65  TCH ){.    /* Le
178a0 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d  ave rc==0 */.  }
178b0 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a  else if( idx1<sz
178c0 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  Hdr1 ){.    rc =
178d0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
178e0 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
178f0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
17900 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
17910 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
17920 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
17930 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
17940 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
17950 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
17960 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
17970 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
17980 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
17990 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
179a0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
179b0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
179c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
179d0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
179e0 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
179f0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
17a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17a10 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
17a20 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
17a30 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
17a40 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
17a50 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
17a60 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
17a70 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
17a80 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
17a90 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
17aa0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
17ab0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
17ac0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
17ad0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17ae0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
17af0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
17b00 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
17b10 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
17b20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
17b30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17b40 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
17b50 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44   m, v;..  UNUSED
17b60 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
17b70 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
17b80 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
17b90 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
17ba0 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
17bb0 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
17bc0 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
17bd0 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
17be0 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
17bf0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
17c00 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f  ** Any corruptio
17c10 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e  n is detected in
17c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
17c30 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f  seCellPtr(), tho
17c40 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69  ugh, so.  ** thi
17c50 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c  s code can safel
17c60 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43  y assume that nC
17c70 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74  ellKey is 32-bit
17c80 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s  .  */.  asser
17c90 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
17ca0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
17cb0 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  r) );.  VVA_ONLY
17cc0 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74  (rc =) sqlite3Bt
17cd0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
17ce0 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61   &nCellKey);.  a
17cf0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
17d00 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70  E_OK );     /* p
17d10 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
17d20 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
17d30 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
17d40 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
17d50 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
17d60 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
17d70 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
17d80 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
17d90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
17da0 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
17db0 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
17dc0 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
17dd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
17de0 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
17df0 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
17e00 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
17e10 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
17e20 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
17e30 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
17e40 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
17e50 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
17e60 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
17e70 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
17e80 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
17e90 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
17ea0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
17eb0 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
17ec0 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
17ed0 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
17ee0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
17ef0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
17f00 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
17f10 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
17f20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
17f30 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
17f40 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
17f50 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
17f60 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
17f70 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
17f80 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
17f90 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
17fa0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
17fb0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
17fc0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17fd0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
17fe0 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
17ff0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18000 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
18010 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
18020 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
18030 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
18040 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
18050 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
18060 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
18070 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
18080 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
18090 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
180a0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
180b0 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
180c0 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
180d0 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
180e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
180f0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
18100 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
18110 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18120 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
18130 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
18140 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
18150 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
18160 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
18170 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
18180 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
18190 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
181a0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
181b0 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
181c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
181d0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
181e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
181f0 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
18200 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
18210 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
18220 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
18230 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18240 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
18250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18260 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
18270 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
18280 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
18290 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
182a0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
182b0 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
182c0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
182d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
182e0 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
182f0 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
18300 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63  tcase( m.zMalloc
18310 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
18320 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
18330 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
18340 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
18360 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
18370 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
18380 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
18390 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
183a0 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
183b0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
183c0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
183d0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
183e0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
183f0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
18400 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
18410 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
18420 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
18430 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
18440 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
18450 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
18460 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
18470 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
18480 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
18490 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
184a0 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
184b0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
184c0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
184d0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
184e0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
184f0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
18500 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
18510 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
18520 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
18530 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
18540 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
18550 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
18560 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
18570 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
18580 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
18590 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62  eyCompare(.  Vdb
185a0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
185b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
185c0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
185d0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
185e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
185f0 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e  Unpacked,  /* Un
18600 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
18610 66 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65  f key to compare
18620 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e   against */.  in
18630 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
18640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
18650 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
18660 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
18670 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
18680 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
18690 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
186a0 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
186b0 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
186c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
186d0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
186e0 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
186f0 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
18700 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
18710 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
18720 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
18730 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
18740 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
18750 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
18760 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
18770 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
18780 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
18790 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
187a0 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
187b0 20 74 68 65 20 73 61 79 0a 20 20 2a 2a 20 74 68   the say.  ** th
187c0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
187d0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
187e0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
187f0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
18800 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
18810 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
18820 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
18830 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
18840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18850 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
18860 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
18870 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
18880 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
18890 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
188a0 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
188b0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
188c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
188d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
188e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
188f0 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
18900 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
18910 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
18920 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18930 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
18940 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
18950 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18960 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
18970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18990 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
189a0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
189b0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
189c0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
189d0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
189e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
189f0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
18a00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
18a10 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
18a20 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
18a30 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
18a40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18a50 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
18a60 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
18a70 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
18a80 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
18a90 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
18aa0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
18ab0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
18ac0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
18ad0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
18ae0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
18af0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
18b00 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
18b10 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
18b20 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
18b30 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
18b40 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
18b50 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18b60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18b70 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
18b80 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
18b90 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
18ba0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
18bb0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
18bc0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
18bd0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
18be0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
18bf0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
18c00 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
18c10 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
18c20 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
18c30 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
18c40 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
18c50 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
18c60 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
18c70 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
18c80 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
18c90 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
18ca0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
18cb0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
18cc0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
18cd0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
18ce0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
18cf0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
18d00 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
18d10 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
18d20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
18d30 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
18d40 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
18d50 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
18d60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
18d70 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
18d80 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
18d90 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
18da0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
18db0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
18dc0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
18dd0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18de0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
18df0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
18e00 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
18e10 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
18e20 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
18e30 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
18e40 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
18e50 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
18e60 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
18e70 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
18e80 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
18e90 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
18ea0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
18eb0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
18ec0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
18ed0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
18ee0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
18ef0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
18f00 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
18f10 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
18f20 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
18f30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
18f40 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
18f50 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
18f60 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
18f70 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
18f80 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
18f90 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
18fa0 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
18fb0 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
18fc0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
18fd0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
18fe0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
18ff0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
19000 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
19010 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
19020 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19030 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
19040 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
19050 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
19060 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
19070 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
19080 55 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73  UTF8);.        s
19090 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f  qlite3VdbeMemSto
190a0 72 65 54 79 70 65 28 28 4d 65 6d 20 2a 29 70 52  reType((Mem *)pR
190b0 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  et);.      }.   
190c0 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
190d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
190e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
190f0 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
19100 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
19110 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
19120 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
19130 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
19140 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
19150 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
19160 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
19170 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
19180 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
19190 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
191a0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
191b0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
191c0 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
191d0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
191e0 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
191f0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
19200 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
19210 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
19220 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
19230 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
19240 0a                                               .