/ Hex Artifact Content
Login

Artifact 0ecbe7ccf78ad893f5011516845c9e2f74faa21a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
01b0: 64 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 70 72  d..**.** $Id: pr
01c0: 61 67 6d 61 2e 63 2c 76 20 31 2e 35 36 20 32 30  agma.c,v 1.56 20
01d0: 30 34 2f 30 36 2f 32 39 20 30 38 3a 35 39 3a 33  04/06/29 08:59:3
01e0: 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78  5 danielk1977 Ex
01f0: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0200: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0210: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0220: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
0230: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
0240: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
0250: 53 54 29 0a 23 20 69 6e 63 6c 75 64 65 20 22 70  ST).# include "p
0260: 61 67 65 72 2e 68 22 0a 23 20 69 6e 63 6c 75 64  ager.h".# includ
0270: 65 20 22 62 74 72 65 65 2e 68 22 0a 23 65 6e 64  e "btree.h".#end
0280: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  if../*.** Interp
0290: 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  ret the given st
02a0: 72 69 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65 61  ring as a boolea
02b0: 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  n value..*/.stat
02c0: 69 63 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61  ic int getBoolea
02d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  n(const char *z)
02e0: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
02f0: 2a 61 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79  *azTrue[] = { "y
0300: 65 73 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65  es", "on", "true
0310: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
0320: 69 66 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65  if( z[0]==0 ) re
0330: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
0340: 64 69 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28  digit(z[0]) || (
0350: 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64  z[0]=='-' && isd
0360: 69 67 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20  igit(z[1])) ){. 
0370: 20 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a     return atoi(z
0380: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
0390: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75  ; i<sizeof(azTru
03a0: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65  e)/sizeof(azTrue
03b0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
03c0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
03d0: 6d 70 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d  mp(z,azTrue[i])=
03e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
03f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
0400: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
0410: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
0420: 6e 67 20 61 73 20 61 20 73 61 66 65 74 79 20 6c  ng as a safety l
0430: 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 30 20  evel.  Return 0 
0440: 66 6f 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66 6f  for OFF,.** 1 fo
0450: 72 20 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 20 61  r ON or NORMAL a
0460: 6e 64 20 32 20 66 6f 72 20 46 55 4c 4c 2e 20 20  nd 2 for FULL.  
0470: 52 65 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20  Return 1 for an 
0480: 65 6d 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72  empty or .** unr
0490: 65 63 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67  ecognized string
04a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
04b0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76   Note that the v
04c0: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 61  alues returned a
04d0: 72 65 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 74  re one less that
04e0: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
04f0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61  .** should be pa
0500: 73 73 65 64 20 69 6e 74 6f 20 73 71 6c 69 74 65  ssed into sqlite
0510: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
0520: 65 76 65 6c 28 29 2e 20 20 54 68 65 20 69 73 20  evel().  The is 
0530: 64 6f 6e 65 0a 2a 2a 20 74 6f 20 73 75 70 70 6f  done.** to suppo
0540: 72 74 20 6c 65 67 61 63 79 20 53 51 4c 20 63 6f  rt legacy SQL co
0550: 64 65 2e 20 20 54 68 65 20 73 61 66 65 74 79 20  de.  The safety 
0560: 6c 65 76 65 6c 20 75 73 65 64 20 74 6f 20 62 65  level used to be
0570: 20 62 6f 6f 6c 65 61 6e 0a 2a 2a 20 61 6e 64 20   boolean.** and 
0580: 6f 6c 64 65 72 20 73 63 72 69 70 74 73 20 6d 61  older scripts ma
0590: 79 20 68 61 76 65 20 75 73 65 64 20 6e 75 6d 62  y have used numb
05a0: 65 72 73 20 30 20 66 6f 72 20 4f 46 46 20 61 6e  ers 0 for OFF an
05b0: 64 20 31 20 66 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73  d 1 for ON..*/.s
05c0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 61 66  tatic int getSaf
05d0: 65 74 79 4c 65 76 65 6c 28 63 68 61 72 20 2a 7a  etyLevel(char *z
05e0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
05f0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
0600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
0610: 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20  ;.    int val;. 
0620: 20 7d 20 61 4b 65 79 5b 5d 20 3d 20 7b 0a 20 20   } aKey[] = {.  
0630: 20 20 7b 20 22 6e 6f 22 2c 20 20 20 20 30 20 7d    { "no",    0 }
0640: 2c 0a 20 20 20 20 7b 20 22 6f 66 66 22 2c 20 20  ,.    { "off",  
0650: 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 6c   0 },.    { "fal
0660: 73 65 22 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20  se", 0 },.    { 
0670: 22 79 65 73 22 2c 20 20 20 31 20 7d 2c 0a 20 20  "yes",   1 },.  
0680: 20 20 7b 20 22 6f 6e 22 2c 20 20 20 20 31 20 7d    { "on",    1 }
0690: 2c 0a 20 20 20 20 7b 20 22 74 72 75 65 22 2c 20  ,.    { "true", 
06a0: 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c   1 },.    { "ful
06b0: 6c 22 2c 20 20 32 20 7d 2c 0a 20 20 7d 3b 0a 20  l",  2 },.  };. 
06c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b   int i;.  if( z[
06d0: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  0]==0 ) return 1
06e0: 3b 0a 20 20 69 66 28 20 69 73 64 69 67 69 74 28  ;.  if( isdigit(
06f0: 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d  z[0]) || (z[0]==
0700: 27 2d 27 20 26 26 20 69 73 64 69 67 69 74 28 7a  '-' && isdigit(z
0710: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72 65 74  [1])) ){.    ret
0720: 75 72 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d  urn atoi(z);.  }
0730: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
0740: 7a 65 6f 66 28 61 4b 65 79 29 2f 73 69 7a 65 6f  zeof(aKey)/sizeo
0750: 66 28 61 4b 65 79 5b 30 5d 29 3b 20 69 2b 2b 29  f(aKey[0]); i++)
0760: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
0770: 33 53 74 72 49 43 6d 70 28 7a 2c 61 4b 65 79 5b  3StrICmp(z,aKey[
0780: 69 5d 2e 7a 57 6f 72 64 29 3d 3d 30 20 29 20 72  i].zWord)==0 ) r
0790: 65 74 75 72 6e 20 61 4b 65 79 5b 69 5d 2e 76 61  eturn aKey[i].va
07a0: 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
07b0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  1;.}../*.** Chec
07c0: 6b 20 74 6f 20 73 65 65 20 69 66 20 7a 52 69 67  k to see if zRig
07d0: 68 74 20 61 6e 64 20 7a 4c 65 66 74 20 72 65 66  ht and zLeft ref
07e0: 65 72 20 74 6f 20 61 20 70 72 61 67 6d 61 20 74  er to a pragma t
07f0: 68 61 74 20 71 75 65 72 69 65 73 0a 2a 2a 20 6f  hat queries.** o
0800: 72 20 63 68 61 6e 67 65 73 20 6f 6e 65 20 6f 66  r changes one of
0810: 20 74 68 65 20 66 6c 61 67 73 20 69 6e 20 64 62   the flags in db
0820: 2d 3e 66 6c 61 67 73 2e 20 20 52 65 74 75 72 6e  ->flags.  Return
0830: 20 31 20 69 66 20 73 6f 20 61 6e 64 20 30 20 69   1 if so and 0 i
0840: 66 20 6e 6f 74 2e 0a 2a 2a 20 41 6c 73 6f 2c 20  f not..** Also, 
0850: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 70 72  implement the pr
0860: 61 67 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  agma..*/.static 
0870: 69 6e 74 20 66 6c 61 67 50 72 61 67 6d 61 28 50  int flagPragma(P
0880: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
0890: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 2c  nst char *zLeft,
08a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 69   const char *zRi
08b0: 67 68 74 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ght){.  static c
08c0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
08d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
08e0: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
08f0: 20 74 68 65 20 70 72 61 67 6d 61 20 2a 2f 0a 20   the pragma */. 
0900: 20 20 20 69 6e 74 20 6d 61 73 6b 3b 20 20 20 20     int mask;    
0910: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66         /* Mask f
0920: 6f 72 20 74 68 65 20 64 62 2d 3e 66 6c 61 67 73  or the db->flags
0930: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 7d 20 61 50   value */.  } aP
0940: 72 61 67 6d 61 5b 5d 20 3d 20 7b 0a 20 20 20 20  ragma[] = {.    
0950: 7b 20 22 76 64 62 65 5f 74 72 61 63 65 22 2c 20  { "vdbe_trace", 
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
0970: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 20 20  LITE_VdbeTrace  
0980: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c     },.    { "sql
0990: 5f 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  _trace",        
09a0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
09b0: 71 6c 54 72 61 63 65 20 20 20 20 20 20 7d 2c 0a  qlTrace      },.
09c0: 20 20 20 20 7b 20 22 76 64 62 65 5f 6c 69 73 74      { "vdbe_list
09d0: 69 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  ing",           
09e0: 20 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69 73    SQLITE_VdbeLis
09f0: 74 69 6e 67 20 20 20 7d 2c 0a 23 69 66 20 31 20  ting   },.#if 1 
0a00: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 52 65 6d   /* FIX ME:  Rem
0a10: 6f 76 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ove the followin
0a20: 67 20 70 72 61 67 6d 61 73 20 2a 2f 0a 20 20 20  g pragmas */.   
0a30: 20 7b 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f   { "full_column_
0a40: 6e 61 6d 65 73 22 2c 20 20 20 20 20 20 20 20 53  names",        S
0a50: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
0a60: 65 73 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68  es  },.    { "sh
0a70: 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
0a80: 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
0a90: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7d 2c  ShortColNames },
0aa0: 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 5f 63 68  .    { "count_ch
0ab0: 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
0ac0: 20 20 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52     SQLITE_CountR
0ad0: 6f 77 73 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ows     },.    {
0ae0: 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f 63   "empty_result_c
0af0: 61 6c 6c 62 61 63 6b 73 22 2c 20 20 20 53 51 4c  allbacks",   SQL
0b00: 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63 6b  ITE_NullCallback
0b10: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b    },.#endif.  };
0b20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
0b30: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 50  i=0; i<sizeof(aP
0b40: 72 61 67 6d 61 29 2f 73 69 7a 65 6f 66 28 61 50  ragma)/sizeof(aP
0b50: 72 61 67 6d 61 5b 30 5d 29 3b 20 69 2b 2b 29 7b  ragma[0]); i++){
0b60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
0b70: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 61  StrICmp(zLeft, a
0b80: 50 72 61 67 6d 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Pragma[i].zName)
0b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
0ba0: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0bb0: 2d 3e 64 62 3b 0a 20 20 20 20 20 20 56 64 62 65  ->db;.      Vdbe
0bc0: 20 2a 76 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   *v;.      if( z
0bd0: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
0be0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
0bf0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
0c00: 20 20 20 20 20 20 20 20 69 66 28 20 76 20 29 7b          if( v ){
0c10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
0c20: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
0c30: 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (v, 1);.        
0c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
0c50: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 61 50  ColName(v, 0, aP
0c60: 72 61 67 6d 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ragma[i].zName, 
0c70: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
0c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0c90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
0ca0: 65 67 65 72 2c 20 28 64 62 2d 3e 66 6c 61 67 73  eger, (db->flags
0cb0: 20 26 20 61 50 72 61 67 6d 61 5b 69 5d 2e 6d 61   & aPragma[i].ma
0cc0: 73 6b 29 21 3d 30 2c 20 30 29 3b 0a 20 20 20 20  sk)!=0, 0);.    
0cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0ce0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
0cf0: 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20  lback, 1, 0);.  
0d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
0d10: 6c 73 65 20 69 66 28 20 67 65 74 42 6f 6f 6c 65  lse if( getBoole
0d20: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
0d30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
0d40: 7c 3d 20 61 50 72 61 67 6d 61 5b 69 5d 2e 6d 61  |= aPragma[i].ma
0d50: 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  sk;.      }else{
0d60: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
0d70: 67 73 20 26 3d 20 7e 61 50 72 61 67 6d 61 5b 69  gs &= ~aPragma[i
0d80: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  ].mask;.      }.
0d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0da0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0db0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
0dc0: 72 6f 63 65 73 73 20 61 20 70 72 61 67 6d 61 20  rocess a pragma 
0dd0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
0de0: 2a 2a 20 50 72 61 67 6d 61 73 20 61 72 65 20 6f  ** Pragmas are o
0df0: 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a 2a 2a 0a  f this form:.**.
0e00: 2a 2a 20 20 20 20 20 20 50 52 41 47 4d 41 20 5b  **      PRAGMA [
0e10: 64 61 74 61 62 61 73 65 2e 5d 69 64 20 5b 3d 20  database.]id [= 
0e20: 76 61 6c 75 65 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  value].**.** The
0e30: 20 69 64 65 6e 74 69 66 69 65 72 20 6d 69 67 68   identifier migh
0e40: 74 20 61 6c 73 6f 20 62 65 20 61 20 73 74 72 69  t also be a stri
0e50: 6e 67 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ng.  The value i
0e60: 73 20 61 20 73 74 72 69 6e 67 2c 20 61 6e 64 0a  s a string, and.
0e70: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  ** identifier, o
0e80: 72 20 61 20 6e 75 6d 62 65 72 2e 20 20 49 66 20  r a number.  If 
0e90: 6d 69 6e 75 73 46 6c 61 67 20 69 73 20 74 72 75  minusFlag is tru
0ea0: 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  e, then the valu
0eb0: 65 20 69 73 0a 2a 2a 20 61 20 6e 75 6d 62 65 72  e is.** a number
0ec0: 20 74 68 61 74 20 77 61 73 20 70 72 65 63 65 64   that was preced
0ed0: 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69  ed by a minus si
0ee0: 67 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gn..*/.void sqli
0ef0: 74 65 33 50 72 61 67 6d 61 28 0a 20 20 50 61 72  te3Pragma(.  Par
0f00: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 54  se *pParse, .  T
0f10: 6f 6b 65 6e 20 2a 70 49 64 31 2c 20 20 20 20 20  oken *pId1,     
0f20: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
0f30: 20 6f 66 20 5b 64 61 74 61 62 61 73 65 2e 5d 69   of [database.]i
0f40: 64 20 66 69 65 6c 64 20 2a 2f 0a 20 20 54 6f 6b  d field */.  Tok
0f50: 65 6e 20 2a 70 49 64 32 2c 20 20 20 20 20 20 20  en *pId2,       
0f60: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
0f70: 6f 66 20 5b 64 61 74 61 62 61 73 65 2e 5d 69 64  of [database.]id
0f80: 20 66 69 65 6c 64 2c 20 6f 72 20 4e 55 4c 4c 20   field, or NULL 
0f90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  */.  Token *pVal
0fa0: 75 65 2c 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ue,      /* Toke
0fb0: 6e 20 66 6f 72 20 3c 76 61 6c 75 65 3e 2c 20 6f  n for <value>, o
0fc0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
0fd0: 6d 69 6e 75 73 46 6c 61 67 20 20 20 20 20 20 20  minusFlag       
0fe0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 27 2d 27  /* True if a '-'
0ff0: 20 73 69 67 6e 20 70 72 65 63 65 64 65 64 20 3c   sign preceded <
1000: 76 61 6c 75 65 3e 20 2a 2f 0a 29 7b 0a 20 20 63  value> */.){.  c
1010: 68 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 20  har *zLeft = 0; 
1020: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
1030: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
1040: 72 69 6e 67 20 3c 69 64 3e 20 2a 2f 0a 20 20 63  ring <id> */.  c
1050: 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20 30 3b  har *zRight = 0;
1060: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
1070: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
1080: 72 69 6e 67 20 3c 76 61 6c 75 65 3e 2c 20 6f 72  ring <value>, or
1090: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
10a0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
10b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
10c0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 6f 6b 65  e name */.  Toke
10d0: 6e 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  n *pId;         
10e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10f0: 20 3c 69 64 3e 20 74 6f 6b 65 6e 20 2a 2f 0a 20   <id> token */. 
1100: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
1110: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1120: 61 73 65 20 69 6e 64 65 78 20 66 6f 72 20 3c 64  ase index for <d
1130: 61 74 61 62 61 73 65 3e 20 2a 2f 0a 20 20 73 71  atabase> */.  sq
1140: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
1150: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
1160: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1170: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1180: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
1190: 0a 20 20 2f 2a 20 49 6e 74 65 72 70 72 65 74 20  .  /* Interpret 
11a0: 74 68 65 20 5b 64 61 74 61 62 61 73 65 2e 5d 20  the [database.] 
11b0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 61 67  part of the prag
11c0: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 69 44  ma statement. iD
11d0: 62 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 69 6e  b is the.  ** in
11e0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
11f0: 61 73 65 20 74 68 69 73 20 70 72 61 67 6d 61 20  ase this pragma 
1200: 69 73 20 62 65 69 6e 67 20 61 70 70 6c 69 65 64  is being applied
1210: 20 74 6f 20 69 6e 20 64 62 2e 61 44 62 5b 5d 2e   to in db.aDb[].
1220: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
1230: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
1240: 50 61 72 73 65 2c 20 70 49 64 31 2c 20 70 49 64  Parse, pId1, pId
1250: 32 2c 20 26 70 49 64 29 3b 0a 20 20 69 66 28 20  2, &pId);.  if( 
1260: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
1270: 0a 20 20 7a 4c 65 66 74 20 3d 20 73 71 6c 69 74  .  zLeft = sqlit
1280: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1290: 70 49 64 29 3b 0a 20 20 69 66 28 20 6d 69 6e 75  pId);.  if( minu
12a0: 73 46 6c 61 67 20 29 7b 0a 20 20 20 20 7a 52 69  sFlag ){.    zRi
12b0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ght = 0;.    sql
12c0: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26  ite3SetNString(&
12d0: 7a 52 69 67 68 74 2c 20 22 2d 22 2c 20 31 2c 20  zRight, "-", 1, 
12e0: 70 56 61 6c 75 65 2d 3e 7a 2c 20 70 56 61 6c 75  pValue->z, pValu
12f0: 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  e->n, 0);.  }els
1300: 65 7b 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20  e{.    zRight = 
1310: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1320: 6f 6b 65 6e 28 70 56 61 6c 75 65 29 3b 0a 20 20  oken(pValue);.  
1330: 7d 0a 0a 20 20 7a 44 62 20 3d 20 28 28 69 44 62  }..  zDb = ((iDb
1340: 3e 30 29 3f 64 62 2d 3e 61 44 62 5b 69 44 62 5d  >0)?db->aDb[iDb]
1350: 2e 7a 4e 61 6d 65 3a 30 29 3b 0a 20 20 69 66 28  .zName:0);.  if(
1360: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1370: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1380: 5f 50 52 41 47 4d 41 2c 20 7a 4c 65 66 74 2c 20  _PRAGMA, zLeft, 
1390: 7a 52 69 67 68 74 2c 20 7a 44 62 29 20 29 7b 0a  zRight, zDb) ){.
13a0: 20 20 20 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f      goto pragma_
13b0: 6f 75 74 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 0a  out;.  }. .  /*.
13c0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
13d0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 0a  ault_cache_size.
13e0: 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 64 65 66    **  PRAGMA def
13f0: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 3d  ault_cache_size=
1400: 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  N.  **.  ** The 
1410: 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70 6f 72  first form repor
1420: 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ts the current p
1430: 65 72 73 69 73 74 65 6e 74 20 73 65 74 74 69 6e  ersistent settin
1440: 67 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70  g for the.  ** p
1450: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 2e 20  age cache size. 
1460: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1470: 6e 65 64 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ned is the maxim
1480: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  um number of.  *
1490: 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  * pages in the p
14a0: 61 67 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  age cache.  The 
14b0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 73 65 74 73  second form sets
14c0: 20 62 6f 74 68 20 74 68 65 20 63 75 72 72 65 6e   both the curren
14d0: 74 0a 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68  t.  ** page cach
14e0: 65 20 73 69 7a 65 20 76 61 6c 75 65 20 61 6e 64  e size value and
14f0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
1500: 70 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20  page cache size 
1510: 76 61 6c 75 65 0a 20 20 2a 2a 20 73 74 6f 72 65  value.  ** store
1520: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
1530: 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e file..  **.  *
1540: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 61  * The default ca
1550: 63 68 65 20 73 69 7a 65 20 69 73 20 73 74 6f 72  che size is stor
1560: 65 64 20 69 6e 20 6d 65 74 61 2d 76 61 6c 75 65  ed in meta-value
1570: 20 32 20 6f 66 20 70 61 67 65 20 31 20 6f 66 20   2 of page 1 of 
1580: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1590: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 61 63  e file.  The cac
15a0: 68 65 20 73 69 7a 65 20 69 73 20 61 63 74 75 61  he size is actua
15b0: 6c 6c 79 20 74 68 65 20 61 62 73 6f 6c 75 74 65  lly the absolute
15c0: 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74   value of.  ** t
15d0: 68 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  his memory locat
15e0: 69 6f 6e 2e 20 20 54 68 65 20 73 69 67 6e 20 6f  ion.  The sign o
15f0: 66 20 6d 65 74 61 2d 76 61 6c 75 65 20 32 20 64  f meta-value 2 d
1600: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 0a 20 20  etermines the.  
1610: 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73  ** synchronous s
1620: 65 74 74 69 6e 67 2e 20 20 41 20 6e 65 67 61 74  etting.  A negat
1630: 69 76 65 20 76 61 6c 75 65 20 6d 65 61 6e 73 20  ive value means 
1640: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
1650: 66 66 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 6f  ff.  ** and a po
1660: 73 69 74 69 76 65 20 76 61 6c 75 65 20 6d 65 61  sitive value mea
1670: 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ns synchronous i
1680: 73 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s on..  */.  if(
1690: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16a0: 7a 4c 65 66 74 2c 22 64 65 66 61 75 6c 74 5f 63  zLeft,"default_c
16b0: 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30 20 29  ache_size")==0 )
16c0: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
16d0: 65 4f 70 4c 69 73 74 20 67 65 74 43 61 63 68 65  eOpList getCache
16e0: 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Size[] = {.     
16f0: 20 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65   { OP_ReadCookie
1700: 2c 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20  ,  0, 2,        
1710: 30 7d 2c 20 20 2f 2a 20 30 20 2a 2f 0a 20 20 20  0},  /* 0 */.   
1720: 20 20 20 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65     { OP_AbsValue
1730: 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
1740: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
1750: 5f 44 75 70 2c 20 20 20 20 20 20 20 20 20 30 2c  _Dup,         0,
1760: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
1770: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
1780: 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  r,     0, 0,    
1790: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
17a0: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20  OP_Ne,          
17b0: 30 2c 20 36 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 6,        0},
17c0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65  .      { OP_Inte
17d0: 67 65 72 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ger,     0, 0,  
17e0: 20 20 20 20 20 20 30 7d 2c 20 20 2f 2a 20 35 20        0},  /* 5 
17f0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61  */.      { OP_Ca
1800: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
1810: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
1820: 7d 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  };.    int addr;
1830: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1840: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1850: 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61  e) ) goto pragma
1860: 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 21 7a  _out;.    if( !z
1870: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
1880: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
1890: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
18a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
18b0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 63  ColName(v, 0, "c
18c0: 61 63 68 65 5f 73 69 7a 65 22 2c 20 50 33 5f 53  ache_size", P3_S
18d0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 61 64  TATIC);.      ad
18e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
18f0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
1900: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
1910: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
1920: 7a 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ze);.      sqlit
1930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
1940: 2c 20 61 64 64 72 2c 20 69 44 62 29 3b 0a 20 20  , addr, iDb);.  
1950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1960: 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 2b  hangeP1(v, addr+
1970: 35 2c 20 4d 41 58 5f 50 41 47 45 53 29 3b 0a 20  5, MAX_PAGES);. 
1980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1990: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
19a0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
19b0: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
19c0: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
19d0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
19e0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
19f0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
1a20: 2c 20 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  , size, 0);.    
1a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a40: 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  Op(v, OP_ReadCoo
1a50: 6b 69 65 2c 20 69 44 62 2c 20 32 29 3b 0a 20 20  kie, iDb, 2);.  
1a60: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a80: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
1a90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1aa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1ab0: 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b 0a 20  e, 0, addr+3);. 
1ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ad0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61  AddOp(v, OP_Nega
1ae0: 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tive, 0, 0);.   
1af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b00: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
1b10: 6b 69 65 2c 20 69 44 62 2c 20 32 29 3b 0a 20 20  kie, iDb, 2);.  
1b20: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
1b30: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1b40: 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
1b50: 61 44 62 5b 69 44 62 5d 2e 63 61 63 68 65 5f 73  aDb[iDb].cache_s
1b60: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
1b70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
1b80: 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d 3e 61  tCacheSize(db->a
1b90: 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 64 62 2d  Db[iDb].pBt, db-
1ba0: 3e 61 44 62 5b 69 44 62 5d 2e 63 61 63 68 65 5f  >aDb[iDb].cache_
1bb0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  size);.    }.  }
1bc0: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
1bd0: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
1be0: 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20  ze.  **  PRAGMA 
1bf0: 63 61 63 68 65 5f 73 69 7a 65 3d 4e 0a 20 20 2a  cache_size=N.  *
1c00: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
1c10: 20 66 6f 72 6d 20 72 65 70 6f 72 74 73 20 74 68   form reports th
1c20: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 20  e current local 
1c30: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
1c40: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
1c50: 73 69 7a 65 2e 20 20 54 68 65 20 6c 6f 63 61 6c  size.  The local
1c60: 20 73 65 74 74 69 6e 67 20 63 61 6e 20 62 65 20   setting can be 
1c70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 0a 20  different from. 
1c80: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
1c90: 6e 74 20 63 61 63 68 65 20 73 69 7a 65 20 76 61  nt cache size va
1ca0: 6c 75 65 20 74 68 61 74 20 69 73 20 73 74 6f 72  lue that is stor
1cb0: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
1cc0: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 73  se.  ** file its
1cd0: 65 6c 66 2e 20 20 54 68 65 20 76 61 6c 75 65 20  elf.  The value 
1ce0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
1cf0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
1d00: 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e 20  f.  ** pages in 
1d10: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
1d20: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
1d30: 20 73 65 74 73 20 74 68 65 20 6c 6f 63 61 6c 0a   sets the local.
1d40: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
1d50: 73 69 7a 65 20 76 61 6c 75 65 2e 20 20 49 74 20  size value.  It 
1d60: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1d70: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 20  the persistent. 
1d80: 20 2a 2a 20 63 61 63 68 65 20 73 69 7a 65 20 73   ** cache size s
1d90: 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 64 69 73  tored on the dis
1da0: 6b 20 73 6f 20 74 68 65 20 63 61 63 68 65 20 73  k so the cache s
1db0: 69 7a 65 20 77 69 6c 6c 20 72 65 76 65 72 74 0a  ize will revert.
1dc0: 20 20 2a 2a 20 74 6f 20 69 74 73 20 64 65 66 61    ** to its defa
1dd0: 75 6c 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ult value when t
1de0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
1df0: 6c 6f 73 65 64 20 61 6e 64 20 72 65 6f 70 65 6e  losed and reopen
1e00: 65 64 2e 0a 20 20 2a 2a 20 4e 20 73 68 6f 75 6c  ed..  ** N shoul
1e10: 64 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20  d be a positive 
1e20: 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  integer..  */.  
1e30: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1e40: 6d 70 28 7a 4c 65 66 74 2c 22 63 61 63 68 65 5f  mp(zLeft,"cache_
1e50: 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  size")==0 ){.   
1e60: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
1e70: 73 74 20 67 65 74 43 61 63 68 65 53 69 7a 65 5b  st getCacheSize[
1e80: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
1e90: 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c  _Callback,    1,
1ea0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
1eb0: 20 20 20 7d 3b 0a 20 20 20 20 69 66 28 20 73 71     };.    if( sq
1ec0: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1ed0: 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70  pParse) ) goto p
1ee0: 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 69  ragma_out;.    i
1ef0: 66 28 20 21 7a 52 69 67 68 74 20 29 7b 0a 20 20  f( !zRight ){.  
1f00: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 64      int size = d
1f10: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 63 61 63 68  b->aDb[iDb].cach
1f20: 65 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 61 73  e_size;.      as
1f30: 73 65 72 74 28 20 73 69 7a 65 3e 30 20 29 3b 0a  sert( size>0 );.
1f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
1f60: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
1f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f80: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
1f90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1fa0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
1fb0: 2c 20 30 2c 20 22 63 61 63 68 65 5f 73 69 7a 65  , 0, "cache_size
1fc0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
1fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fe0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
1ff0: 61 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53  aySize(getCacheS
2000: 69 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69  ize), getCacheSi
2010: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
2020: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
2030: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
2040: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
2050: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
2060: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
2070: 62 5d 2e 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  b].cache_size = 
2080: 73 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  size;.      sqli
2090: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
20a0: 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 69 44 62  Size(db->aDb[iDb
20b0: 5d 2e 70 42 74 2c 20 64 62 2d 3e 61 44 62 5b 69  ].pBt, db->aDb[i
20c0: 44 62 5d 2e 63 61 63 68 65 5f 73 69 7a 65 29 3b  Db].cache_size);
20d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
20e0: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47    /*.  **   PRAG
20f0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  MA synchronous. 
2100: 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79 6e   **   PRAGMA syn
2110: 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e 7c  chronous=OFF|ON|
2120: 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a 2a  NORMAL|FULL.  **
2130: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20  .  ** Return or 
2140: 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76 61  set the local va
2150: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63 68  lue of the synch
2160: 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43 68  ronous flag.  Ch
2170: 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anging.  ** the 
2180: 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65 73  local value does
2190: 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67 65   not make change
21a0: 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66 69  s to the disk fi
21b0: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20  le and the.  ** 
21c0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
21d0: 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ll be restored t
21e0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
21f0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20 2a   database is.  *
2200: 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  * opened..  */. 
2210: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
2220: 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63 68  Cmp(zLeft,"synch
2230: 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20  ronous")==0 ){. 
2240: 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70     static VdbeOp
2250: 4c 69 73 74 20 67 65 74 53 79 6e 63 5b 5d 20 3d  List getSync[] =
2260: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61   {.      { OP_Ca
2270: 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c  llback,    1, 0,
2280: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
2290: 7d 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  };.    if( sqlit
22a0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
22b0: 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61 67  rse) ) goto prag
22c0: 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 69 66 28 20  ma_out;.    if( 
22d0: 21 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  !zRight ){.     
22e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
22f0: 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20  umCols(v, 1);.  
2300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
2310: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
2320: 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 50  "synchronous", P
2330: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
2340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2350: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
2360: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61   db->aDb[iDb].sa
2370: 66 65 74 79 5f 6c 65 76 65 6c 2d 31 2c 20 30 29  fety_level-1, 0)
2380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2390: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
23a0: 41 72 72 61 79 53 69 7a 65 28 67 65 74 53 79 6e  ArraySize(getSyn
23b0: 63 29 2c 20 67 65 74 53 79 6e 63 29 3b 0a 20 20  c), getSync);.  
23c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
23d0: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
23e0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  it ){.        sq
23f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2400: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2410: 20 20 20 22 53 61 66 65 74 79 20 6c 65 76 65 6c     "Safety level
2420: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
2430: 67 65 64 20 69 6e 73 69 64 65 20 61 20 74 72 61  ged inside a tra
2440: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
2450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2460: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61   db->aDb[iDb].sa
2470: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65 74  fety_level = get
2480: 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69 67  SafetyLevel(zRig
2490: 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 73  ht)+1;.        s
24a0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
24b0: 66 65 74 79 4c 65 76 65 6c 28 64 62 2d 3e 61 44  fetyLevel(db->aD
24c0: 62 5b 69 44 62 5d 2e 70 42 74 2c 64 62 2d 3e 61  b[iDb].pBt,db->a
24d0: 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c  Db[iDb].safety_l
24e0: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  evel);.      }. 
24f0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
2500: 66 20 30 20 20 2f 2a 20 55 73 65 64 20 6f 6e 63  f 0  /* Used onc
2510: 65 20 64 75 72 69 6e 67 20 64 65 76 65 6c 6f 70  e during develop
2520: 6d 65 6e 74 2e 20 20 4e 6f 20 6c 6f 6e 67 65 72  ment.  No longer
2530: 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28   needed */.  if(
2540: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2550: 7a 4c 65 66 74 2c 20 22 74 72 69 67 67 65 72 5f  zLeft, "trigger_
2560: 6f 76 65 72 68 65 61 64 5f 74 65 73 74 22 29 3d  overhead_test")=
2570: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65  =0 ){.    if( ge
2580: 74 42 6f 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29  tBoolean(zRight)
2590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25a0: 33 5f 61 6c 77 61 79 73 5f 63 6f 64 65 5f 74 72  3_always_code_tr
25b0: 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20 31 3b  igger_setup = 1;
25c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25d0: 20 20 73 71 6c 69 74 65 33 5f 61 6c 77 61 79 73    sqlite3_always
25e0: 5f 63 6f 64 65 5f 74 72 69 67 67 65 72 5f 73 65  _code_trigger_se
25f0: 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tup = 0;.    }. 
2600: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2610: 20 69 66 28 20 66 6c 61 67 50 72 61 67 6d 61 28   if( flagPragma(
2620: 70 50 61 72 73 65 2c 20 7a 4c 65 66 74 2c 20 7a  pParse, zLeft, z
2630: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 2f 2a  Right) ){.    /*
2640: 20 54 68 65 20 66 6c 61 67 50 72 61 67 6d 61 28   The flagPragma(
2650: 29 20 63 61 6c 6c 20 61 6c 73 6f 20 67 65 6e 65  ) call also gene
2660: 72 61 74 65 73 20 61 6e 79 20 6e 65 63 65 73 73  rates any necess
2670: 61 72 79 20 63 6f 64 65 20 2a 2f 0a 20 20 7d 65  ary code */.  }e
2680: 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  lse..  /*.  **  
2690: 20 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e   PRAGMA table_in
26a0: 66 6f 28 3c 74 61 62 6c 65 3e 29 0a 20 20 2a 2a  fo(<table>).  **
26b0: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  .  ** Return a s
26c0: 69 6e 67 6c 65 20 72 6f 77 20 66 6f 72 20 65 61  ingle row for ea
26d0: 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ch column of the
26e0: 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 20 54 68   named table. Th
26f0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a  e columns of.  *
2700: 2a 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 64  * the returned d
2710: 61 74 61 20 73 65 74 20 61 72 65 3a 0a 20 20 2a  ata set are:.  *
2720: 2a 0a 20 20 2a 2a 20 63 69 64 3a 20 20 20 20 20  *.  ** cid:     
2730: 20 20 20 43 6f 6c 75 6d 6e 20 69 64 20 28 6e 75     Column id (nu
2740: 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
2750: 20 74 6f 20 72 69 67 68 74 2c 20 73 74 61 72 74   to right, start
2760: 69 6e 67 20 61 74 20 30 29 0a 20 20 2a 2a 20 6e  ing at 0).  ** n
2770: 61 6d 65 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d  ame:       Colum
2780: 6e 20 6e 61 6d 65 0a 20 20 2a 2a 20 74 79 70 65  n name.  ** type
2790: 3a 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 64  :       Column d
27a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 2e  eclaration type.
27b0: 0a 20 20 2a 2a 20 6e 6f 74 6e 75 6c 6c 3a 20 20  .  ** notnull:  
27c0: 20 20 54 72 75 65 20 69 66 20 27 4e 4f 54 20 4e    True if 'NOT N
27d0: 55 4c 4c 27 20 69 73 20 70 61 72 74 20 6f 66 20  ULL' is part of 
27e0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
27f0: 6f 6e 0a 20 20 2a 2a 20 64 66 6c 74 5f 76 61 6c  on.  ** dflt_val
2800: 75 65 3a 20 54 68 65 20 64 65 66 61 75 6c 74 20  ue: The default 
2810: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
2820: 6c 75 6d 6e 2c 20 69 66 20 61 6e 79 2e 0a 20 20  lumn, if any..  
2830: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2840: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
2850: 74 61 62 6c 65 5f 69 6e 66 6f 22 29 3d 3d 30 20  table_info")==0 
2860: 26 26 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20  && zRight ){.   
2870: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2880: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
2890: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
28a0: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
28b0: 74 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71  t;.    pTab = sq
28c0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
28d0: 62 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20  b, zRight, 0);. 
28e0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
28f0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
2910: 4e 75 6d 43 6f 6c 73 28 76 2c 20 36 29 3b 0a 20  NumCols(v, 6);. 
2920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2930: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c  SetColName(v, 0,
2940: 20 22 63 69 64 22 2c 20 50 33 5f 53 54 41 54 49   "cid", P3_STATI
2950: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
2960: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
2970: 76 2c 20 31 2c 20 22 6e 61 6d 65 22 2c 20 50 33  v, 1, "name", P3
2980: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
2990: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
29a0: 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 22 74 79 70  lName(v, 2, "typ
29b0: 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
29c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29d0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 33  eSetColName(v, 3
29e0: 2c 20 22 6e 6f 74 6e 75 6c 6c 22 2c 20 50 33 5f  , "notnull", P3_
29f0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
2a00: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
2a10: 4e 61 6d 65 28 76 2c 20 34 2c 20 22 64 66 6c 74  Name(v, 4, "dflt
2a20: 5f 76 61 6c 75 65 22 2c 20 50 33 5f 53 54 41 54  _value", P3_STAT
2a30: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
2a40: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
2a50: 28 76 2c 20 35 2c 20 22 70 6b 22 2c 20 50 33 5f  (v, 5, "pk", P3_
2a60: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
2a70: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
2a80: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2a90: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 66 6f   pTab);.      fo
2aa0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  r(i=0; i<pTab->n
2ab0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ad0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
2ae0: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, i, 0);.      
2af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
2b00: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
2b10: 30 2c 20 30 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  0, 0, pTab->aCol
2b20: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  [i].zName, 0);. 
2b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b40: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
2b50: 6e 67 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ng8, 0, 0,.     
2b60: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
2b70: 5b 69 5d 2e 7a 54 79 70 65 20 3f 20 70 54 61 62  [i].zType ? pTab
2b80: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20  ->aCol[i].zType 
2b90: 3a 20 22 6e 75 6d 65 72 69 63 22 2c 20 30 29 3b  : "numeric", 0);
2ba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2bc0: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 61  Integer, pTab->a
2bd0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 2c 20  Col[i].notNull, 
2be0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2bf0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
2c00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 0a  _String8, 0, 0,.
2c10: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
2c20: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20  >aCol[i].zDflt, 
2c30: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
2c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c50: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
2c60: 65 72 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  er, pTab->aCol[i
2c70: 5d 2e 69 73 50 72 69 6d 4b 65 79 2c 20 30 29 3b  ].isPrimKey, 0);
2c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2ca0: 43 61 6c 6c 62 61 63 6b 2c 20 36 2c 20 30 29 3b  Callback, 6, 0);
2cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2cc0: 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 73 71   }else..  if( sq
2cd0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
2ce0: 66 74 2c 20 22 69 6e 64 65 78 5f 69 6e 66 6f 22  ft, "index_info"
2cf0: 29 3d 3d 30 20 26 26 20 7a 52 69 67 68 74 20 29  )==0 && zRight )
2d00: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
2d10: 78 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  x;.    Table *pT
2d20: 61 62 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ab;.    if( sqli
2d30: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
2d40: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 70 72 61  arse) ) goto pra
2d50: 67 6d 61 5f 6f 75 74 3b 0a 20 20 20 20 70 49 64  gma_out;.    pId
2d60: 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
2d70: 6e 64 65 78 28 64 62 2c 20 7a 52 69 67 68 74 2c  ndex(db, zRight,
2d80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64   0);.    if( pId
2d90: 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
2da0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
2db0: 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  Idx->pTable;.   
2dc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
2dd0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 33 29 3b 0a  tNumCols(v, 3);.
2de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2df0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
2e00: 2c 20 22 73 65 71 6e 6f 22 2c 20 50 33 5f 53 54  , "seqno", P3_ST
2e10: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
2e20: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
2e30: 6d 65 28 76 2c 20 31 2c 20 22 63 69 64 22 2c 20  me(v, 1, "cid", 
2e40: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
2e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
2e60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 22 6e  ColName(v, 2, "n
2e70: 61 6d 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ame", P3_STATIC)
2e80: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2e90: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
2ea0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2eb0: 69 6e 74 20 63 6e 75 6d 20 3d 20 70 49 64 78 2d  int cnum = pIdx-
2ec0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
2ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ee0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
2ef0: 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20  eger, i, 0);.   
2f00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
2f20: 67 65 72 2c 20 63 6e 75 6d 2c 20 30 29 3b 0a 20  ger, cnum, 0);. 
2f30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f40: 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e 75 6d 20 29  Tab->nCol>cnum )
2f50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2f60: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
2f70: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54  tring8, 0, 0, pT
2f80: 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75 6d 5d 2e 7a  ab->aCol[cnum].z
2f90: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
2fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fb0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
2fc0: 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, 3, 0);.      
2fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
2fe0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
2ff0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e  rICmp(zLeft, "in
3000: 64 65 78 5f 6c 69 73 74 22 29 3d 3d 30 20 26 26  dex_list")==0 &&
3010: 20 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 49   zRight ){.    I
3020: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
3030: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
3040: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64   if( sqlite3Read
3050: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
3060: 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74   goto pragma_out
3070: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
3080: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
3090: 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , zRight, 0);.  
30a0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
30b0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
30c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
30d0: 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 54 61        pIdx = pTa
30e0: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
30f0: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
3100: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20       int i = 0; 
3110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3120: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
3130: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 3);.        sq
3140: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
3150: 61 6d 65 28 76 2c 20 30 2c 20 22 73 65 71 22 2c  ame(v, 0, "seq",
3160: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3180: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c  SetColName(v, 1,
3190: 20 22 6e 61 6d 65 22 2c 20 50 33 5f 53 54 41 54   "name", P3_STAT
31a0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
31b0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
31c0: 6d 65 28 76 2c 20 32 2c 20 22 75 6e 69 71 75 65  me(v, 2, "unique
31d0: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
31e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64         while(pId
31f0: 78 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  x){.          sq
3200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3210: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
3220: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
3230: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
3240: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
3250: 30 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  0, pIdx->zName, 
3260: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
3270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3280: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49  , OP_Integer, pI
3290: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
32a0: 4e 6f 6e 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  None, 0);.      
32b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
32d0: 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20 20 20  ack, 3, 0);.    
32e0: 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20 20        ++i;.     
32f0: 20 20 20 20 20 70 49 64 78 20 3d 20 70 49 64 78       pIdx = pIdx
3300: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
3310: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3320: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
3330: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3340: 4c 65 66 74 2c 20 22 66 6f 72 65 69 67 6e 5f 6b  Left, "foreign_k
3350: 65 79 5f 6c 69 73 74 22 29 3d 3d 30 20 26 26 20  ey_list")==0 && 
3360: 7a 52 69 67 68 74 20 29 7b 0a 20 20 20 20 46 4b  zRight ){.    FK
3370: 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62  ey *pFK;.    Tab
3380: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66  le *pTab;.    if
3390: 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
33a0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
33b0: 74 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20  to pragma_out;. 
33c0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
33d0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
33e0: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 69  Right, 0);.    i
33f0: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20  f( pTab ){.     
3400: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
3410: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
3420: 20 20 20 70 46 4b 20 3d 20 70 54 61 62 2d 3e 70     pFK = pTab->p
3430: 46 4b 65 79 3b 0a 20 20 20 20 20 20 69 66 28 20  FKey;.      if( 
3440: 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pFK ){.        i
3450: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
3460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3470: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 35 29 3b 0a  tNumCols(v, 5);.
3480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3490: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
34a0: 20 30 2c 20 22 69 64 22 2c 20 50 33 5f 53 54 41   0, "id", P3_STA
34b0: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
34c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
34d0: 61 6d 65 28 76 2c 20 31 2c 20 22 73 65 71 22 2c  ame(v, 1, "seq",
34e0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
34f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3500: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32 2c  SetColName(v, 2,
3510: 20 22 74 61 62 6c 65 22 2c 20 50 33 5f 53 54 41   "table", P3_STA
3520: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TIC);.        sq
3530: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
3540: 61 6d 65 28 76 2c 20 33 2c 20 22 66 72 6f 6d 22  ame(v, 3, "from"
3550: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3570: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 34  eSetColName(v, 4
3580: 2c 20 22 74 6f 22 2c 20 50 33 5f 53 54 41 54 49  , "to", P3_STATI
3590: 43 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  C);.        whil
35a0: 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20 20 20  e(pFK){.        
35b0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
35c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46     for(j=0; j<pF
35d0: 4b 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  K->nCol; j++){. 
35e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
35f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3600: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
3610: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
3620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3630: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2c  , OP_Integer, j,
3640: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
3650: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
3660: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
3670: 2c 20 30 2c 20 70 46 4b 2d 3e 7a 54 6f 2c 20 30  , 0, pFK->zTo, 0
3680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
3690: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
36a0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
36b0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 46 4b 2d 3e  pTab->aCol[pFK->
36e0: 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f 6d 5d 2e 7a  aCol[j].iFrom].z
36f0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
3700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3710: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
3720: 67 38 2c 20 30 2c 20 30 2c 20 70 46 4b 2d 3e 61  g8, 0, 0, pFK->a
3730: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 20 30 29 3b  Col[j].zCol, 0);
3740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
3750: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3760: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c   OP_Callback, 5,
3770: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
3780: 0a 20 20 20 20 20 20 20 20 20 20 2b 2b 69 3b 0a  .          ++i;.
3790: 20 20 20 20 20 20 20 20 20 20 70 46 4b 20 3d 20            pFK = 
37a0: 70 46 4b 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  pFK->pNextFrom;.
37b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
37d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
37e0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 64 61  rICmp(zLeft, "da
37f0: 74 61 62 61 73 65 5f 6c 69 73 74 22 29 3d 3d 30  tabase_list")==0
3800: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
3820: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
3830: 20 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f   ) goto pragma_o
3840: 75 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ut;.    sqlite3V
3850: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
3860: 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   3);.    sqlite3
3870: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3880: 2c 20 30 2c 20 22 73 65 71 22 2c 20 50 33 5f 53  , 0, "seq", P3_S
3890: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
38a0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
38b0: 65 28 76 2c 20 31 2c 20 22 6e 61 6d 65 22 2c 20  e(v, 1, "name", 
38c0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
38d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
38e0: 6c 4e 61 6d 65 28 76 2c 20 32 2c 20 22 66 69 6c  lName(v, 2, "fil
38f0: 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
3900: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
3910: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3920: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
3930: 69 5d 2e 70 42 74 3d 3d 30 20 29 20 63 6f 6e 74  i].pBt==0 ) cont
3940: 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
3950: 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  rt( db->aDb[i].z
3960: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
3970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3980: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3990: 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   i, 0);.      sq
39a0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
39b0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
39c0: 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
39d0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  me, 0);.      sq
39e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
39f0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
3a00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
3a10: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
3a20: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  name(db->aDb[i].
3a30: 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
3a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3a50: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
3a60: 20 33 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   3, 0);.    }.  
3a70: 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e  }else..#ifndef N
3a80: 44 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69  DEBUG.  if( sqli
3a90: 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74  te3StrICmp(zLeft
3aa0: 2c 20 22 70 61 72 73 65 72 5f 74 72 61 63 65 22  , "parser_trace"
3ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  )==0 ){.    exte
3ac0: 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50  rn void sqlite3P
3ad0: 61 72 73 65 72 54 72 61 63 65 28 46 49 4c 45 2a  arserTrace(FILE*
3ae0: 2c 20 63 68 61 72 20 2a 29 3b 0a 20 20 20 20 69  , char *);.    i
3af0: 66 28 20 67 65 74 42 6f 6f 6c 65 61 6e 28 7a 52  f( getBoolean(zR
3b00: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ight) ){.      s
3b10: 71 6c 69 74 65 33 50 61 72 73 65 72 54 72 61 63  qlite3ParserTrac
3b20: 65 28 73 74 64 6f 75 74 2c 20 22 70 61 72 73 65  e(stdout, "parse
3b30: 72 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r: ");.    }else
3b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
3b50: 61 72 73 65 72 54 72 61 63 65 28 30 2c 20 30 29  arserTrace(0, 0)
3b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
3b70: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
3b80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4c 65  lite3StrICmp(zLe
3b90: 66 74 2c 20 22 69 6e 74 65 67 72 69 74 79 5f 63  ft, "integrity_c
3ba0: 68 65 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  heck")==0 ){.   
3bb0: 20 69 6e 74 20 69 2c 20 6a 2c 20 61 64 64 72 3b   int i, j, addr;
3bc0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68  ..    /* Code th
3bd0: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  at initializes t
3be0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 63 68 65  he integrity che
3bf0: 63 6b 20 70 72 6f 67 72 61 6d 2e 20 20 53 65 74  ck program.  Set
3c00: 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 72 72 6f   the.    ** erro
3c10: 72 20 63 6f 75 6e 74 20 30 0a 20 20 20 20 2a 2f  r count 0.    */
3c20: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
3c30: 4f 70 4c 69 73 74 20 69 6e 69 74 43 6f 64 65 5b  OpList initCode[
3c40: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
3c50: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20 30 2c  _Integer,     0,
3c60: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   0,        0},. 
3c70: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
3c80: 72 65 2c 20 20 20 20 30 2c 20 31 2c 20 20 20 20  re,    0, 1,    
3c90: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 0a      0},.    };..
3ca0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 61 74      /* Code that
3cb0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
3cc0: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 74 65 67  end of the integ
3cd0: 72 69 74 79 20 63 68 65 63 6b 2e 20 20 49 66 20  rity check.  If 
3ce0: 6e 6f 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  no error.    ** 
3cf0: 6d 65 73 73 61 67 65 73 20 68 61 76 65 20 62 65  messages have be
3d00: 65 6e 20 67 65 6e 65 72 61 74 65 64 2c 20 6f 75  en generated, ou
3d10: 74 70 75 74 20 4f 4b 2e 20 20 4f 74 68 65 72 77  tput OK.  Otherw
3d20: 69 73 65 20 6f 75 74 70 75 74 20 74 68 65 0a 20  ise output the. 
3d30: 20 20 20 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73     ** error mess
3d40: 61 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  age.    */.    s
3d50: 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74  tatic VdbeOpList
3d60: 20 65 6e 64 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20   endCode[] = {. 
3d70: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
3d80: 64 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  d,     0, 0,    
3d90: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
3da0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 20  OP_Integer,     
3db0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
3dc0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  .      { OP_Ne, 
3dd0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20           0, 0,  
3de0: 20 20 20 20 20 20 30 7d 2c 20 20 20 20 2f 2a 20        0},    /* 
3df0: 32 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  2 */.      { OP_
3e00: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 20 30 2c  String8,      0,
3e10: 20 30 2c 20 20 20 20 20 20 20 20 22 6f 6b 22 7d   0,        "ok"}
3e20: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c  ,.      { OP_Cal
3e30: 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20  lback,    1, 0, 
3e40: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d         0},.    }
3e50: 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ;..    /* Initia
3e60: 6c 69 7a 65 20 74 68 65 20 56 44 42 45 20 70 72  lize the VDBE pr
3e70: 6f 67 72 61 6d 20 2a 2f 0a 20 20 20 20 69 66 28  ogram */.    if(
3e80: 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65   sqlite3ReadSche
3e90: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
3ea0: 6f 20 70 72 61 67 6d 61 5f 6f 75 74 3b 0a 20 20  o pragma_out;.  
3eb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
3ec0: 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20  NumCols(v, 1);. 
3ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
3ee0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22  tColName(v, 0, "
3ef0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
3f00: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3f20: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
3f30: 69 7a 65 28 69 6e 69 74 43 6f 64 65 29 2c 20 69  ize(initCode), i
3f40: 6e 69 74 43 6f 64 65 29 3b 0a 0a 20 20 20 20 2f  nitCode);..    /
3f50: 2a 20 44 6f 20 61 6e 20 69 6e 74 65 67 72 69 74  * Do an integrit
3f60: 79 20 63 68 65 63 6b 20 6f 6e 20 65 61 63 68 20  y check on each 
3f70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3f80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3f90: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3fa0: 20 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 78       HashElem *x
3fb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
3fc0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  = 0;..      sqli
3fd0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
3fe0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
3ff0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
4000: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
4010: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
4020: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
4030: 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (x=sqliteHashFir
4040: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74  st(&db->aDb[i].t
4050: 62 6c 48 61 73 68 29 3b 20 78 3b 20 78 3d 73 71  blHash); x; x=sq
4060: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
4070: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
4080: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
4090: 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20  shData(x);.     
40a0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
40b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
40c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
40d0: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 74 6e  nteger, pTab->tn
40e0: 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
40f0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
4100: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
4110: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
4120: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
4130: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
4140: 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f  ite3CheckIndexCo
4150: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
4160: 64 78 29 20 29 20 67 6f 74 6f 20 70 72 61 67 6d  dx) ) goto pragm
4170: 61 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  a_out;.         
4180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4190: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
41a0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 30 29 3b   pIdx->tnum, 0);
41b0: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  .          cnt++
41c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
41d0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
41e0: 28 20 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 20  ( cnt>0 );.     
41f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4200: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69 74  p(v, OP_Integrit
4210: 79 43 6b 2c 20 63 6e 74 2c 20 69 29 3b 0a 20 20  yCk, cnt, i);.  
4220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4230: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
4240: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64  0, 1);.      add
4250: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f  r = sqlite3VdbeO
4260: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
4270: 2c 20 30 2c 20 30 2c 20 22 6f 6b 22 2c 20 50 33  , 0, 0, "ok", P3
4280: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
42a0: 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20 61 64  (v, OP_Eq, 0, ad
42b0: 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+6);.      sql
42c0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
42d0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
42e0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
42f0: 33 4d 50 72 69 6e 74 66 28 22 2a 2a 2a 20 69 6e  3MPrintf("*** in
4300: 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a 2a   database %s ***
4310: 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  \n", db->aDb[i].
4320: 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
4330: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
4340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4350: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
4360: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
4370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4380: 2c 20 4f 50 5f 43 6f 6e 63 61 74 38 2c 20 32 2c  , OP_Concat8, 2,
4390: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
43a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
43b0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
43c0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  );..      /* Mak
43d0: 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69  e sure all the i
43e0: 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74  ndices are const
43f0: 72 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79  ructed correctly
4400: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
4410: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
4420: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
4430: 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 78   i);.      for(x
4440: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
4450: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c  (&db->aDb[i].tbl
4460: 48 61 73 68 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Hash); x; x=sqli
4470: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
4480: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
4490: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
44a0: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
44b0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
44c0: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
44d0: 70 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  p;..        if( 
44e0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pTab->pIndex==0 
44f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4510: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4520: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
4530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4540: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
4550: 61 64 2c 20 31 2c 20 70 54 61 62 2d 3e 74 6e 75  ad, 1, pTab->tnu
4560: 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
4570: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4580: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
4590: 2c 20 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  , 1, pTab->nCol)
45a0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
45b0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
45c0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
45d0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
45e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
45f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 30 20  ( pIdx->tnum==0 
4600: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4620: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4630: 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
4640: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
4650: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4660: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 6a 2b   OP_OpenRead, j+
4670: 32 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a  2, pIdx->tnum, .
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
46a0: 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  &pIdx->keyInfo, 
46b0: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
46c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
46d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
46e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
46f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4710: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 31  , OP_MemStore, 1
4720: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f  , 1);.        lo
4730: 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  opTop = sqlite3V
4740: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
4750: 65 77 69 6e 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ewind, 1, 0);.  
4760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4770: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4780: 49 6e 63 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Incr, 1, 0);.   
4790: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
47a0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
47b0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
47c0: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
47d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70           int jmp
47e0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  2;.          sta
47f0: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 69  tic VdbeOpList i
4800: 64 78 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20  dxErr[] = {.    
4810: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d          { OP_Mem
4820: 49 6e 63 72 2c 20 20 20 20 20 30 2c 20 20 30 2c  Incr,     0,  0,
4830: 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20    0},.          
4840: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
4850: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 22 72 6f       0,  0,  "ro
4860: 77 69 64 20 22 7d 2c 0a 20 20 20 20 20 20 20 20  wid "},.        
4870: 20 20 20 20 7b 20 4f 50 5f 52 65 63 6e 6f 2c 20      { OP_Recno, 
4880: 20 20 20 20 20 20 31 2c 20 20 30 2c 20 20 30 7d        1,  0,  0}
4890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
48a0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
48b0: 20 30 2c 20 20 30 2c 20 20 22 20 6d 69 73 73 69   0,  0,  " missi
48c0: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 7d  ng from index "}
48d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
48e0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
48f0: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
4900: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 4 */.        
4910: 20 20 20 20 7b 20 4f 50 5f 43 6f 6e 63 61 74 38      { OP_Concat8
4920: 2c 20 20 20 20 20 20 34 2c 20 20 30 2c 20 20 30  ,      4,  0,  0
4930: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
4940: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
4950: 20 31 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20 20   1,  0,  0},.   
4960: 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
4970: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
4980: 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70  ateIndexKey(v, p
4990: 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Idx, 1);.       
49a0: 20 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65     jmp2 = sqlite
49b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
49c0: 5f 46 6f 75 6e 64 2c 20 6a 2b 32 2c 20 30 29 3b  _Found, j+2, 0);
49d0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
49e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
49f0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
4a00: 69 7a 65 28 69 64 78 45 72 72 29 2c 20 69 64 78  ize(idxErr), idx
4a10: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Err);.          
4a20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4a30: 65 50 33 28 76 2c 20 61 64 64 72 2b 34 2c 20 70  eP3(v, addr+4, p
4a40: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
4a50: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
4a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4a70: 6e 67 65 50 32 28 76 2c 20 6a 6d 70 32 2c 20 73  ngeP2(v, jmp2, s
4a80: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4a90: 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20  tAddr(v));.     
4aa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
4ab0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4ac0: 20 4f 50 5f 4e 65 78 74 2c 20 31 2c 20 6c 6f 6f   OP_Next, 1, loo
4ad0: 70 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  pTop+1);.       
4ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4af0: 67 65 50 32 28 76 2c 20 6c 6f 6f 70 54 6f 70 2c  geP2(v, loopTop,
4b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4b10: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
4b20: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
4b30: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
4b40: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
4b50: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
4b60: 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
4b70: 56 64 62 65 4f 70 4c 69 73 74 20 63 6e 74 49 64  VdbeOpList cntId
4b80: 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  x[] = {.        
4b90: 20 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65       { OP_Intege
4ba0: 72 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20  r,      0,  0,  
4bb0: 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0},.            
4bc0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
4bd0: 20 20 20 20 32 2c 20 20 31 2c 20 20 30 7d 2c 0a      2,  1,  0},.
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f               { O
4bf0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
4c00: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20  0,  0,  0},  /* 
4c10: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  2 */.           
4c20: 20 20 7b 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20    { OP_MemIncr, 
4c30: 20 20 20 20 20 32 2c 20 20 30 2c 20 20 30 7d 2c       2,  0,  0},
4c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  .             { 
4c50: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20  OP_Next,        
4c60: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a   0,  0,  0},  /*
4c70: 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   4 */.          
4c80: 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
4c90: 20 20 20 20 20 20 31 2c 20 20 30 2c 20 20 30 7d        1,  0,  0}
4ca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ,.             {
4cb0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
4cc0: 20 20 32 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20    2,  0,  0},.  
4cd0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f             { OP_
4ce0: 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c  Eq,           0,
4cf0: 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20 37 20    0,  0},  /* 7 
4d00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
4d10: 7b 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 20 20  { OP_MemIncr,   
4d20: 20 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 0a 20     0,  0,  0},. 
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50              { OP
4d40: 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 20 20  _String8,       
4d50: 30 2c 20 20 30 2c 20 20 22 77 72 6f 6e 67 20 23  0,  0,  "wrong #
4d60: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69   of entries in i
4d70: 6e 64 65 78 20 22 7d 2c 0a 20 20 20 20 20 20 20  ndex "},.       
4d80: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
4d90: 67 38 2c 20 20 20 20 20 20 20 30 2c 20 20 30 2c  g8,       0,  0,
4da0: 20 20 30 7d 2c 20 20 2f 2a 20 31 30 20 2a 2f 0a    0},  /* 10 */.
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f               { O
4dc0: 50 5f 43 6f 6e 63 61 74 38 2c 20 20 20 20 20 20  P_Concat8,      
4dd0: 20 32 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20 20   2,  0,  0},.   
4de0: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43            { OP_C
4df0: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 20 31 2c 20  allback,     1, 
4e00: 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20   0,  0},.       
4e10: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20     };.          
4e20: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
4e30: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4e40: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
4e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
4e60: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
4e70: 28 63 6e 74 49 64 78 29 2c 20 63 6e 74 49 64 78  (cntIdx), cntIdx
4e80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4e90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
4ea0: 28 76 2c 20 61 64 64 72 2b 32 2c 20 6a 2b 32 29  (v, addr+2, j+2)
4eb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4ec0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4ed0: 76 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  v, addr+2, addr+
4ee0: 35 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  5);.          sq
4ef0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4f00: 31 28 76 2c 20 61 64 64 72 2b 34 2c 20 6a 2b 32  1(v, addr+4, j+2
4f10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4f20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
4f30: 28 76 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72  (v, addr+4, addr
4f40: 2b 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  +3);.          s
4f50: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4f60: 50 32 28 76 2c 20 61 64 64 72 2b 37 2c 20 61 64  P2(v, addr+7, ad
4f70: 64 72 2b 41 72 72 61 79 53 69 7a 65 28 63 6e 74  dr+ArraySize(cnt
4f80: 49 64 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Idx));.         
4f90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4fa0: 67 65 50 33 28 76 2c 20 61 64 64 72 2b 31 30 2c  geP3(v, addr+10,
4fb0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33   pIdx->zName, P3
4fc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
4fe0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71   }.    addr = sq
4ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
5000: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
5010: 65 6e 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64  endCode), endCod
5020: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
5030: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
5040: 64 64 72 2b 32 2c 20 61 64 64 72 2b 41 72 72 61  ddr+2, addr+Arra
5050: 79 53 69 7a 65 28 65 6e 64 43 6f 64 65 29 29 3b  ySize(endCode));
5060: 0a 20 20 7d 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  .  }else.  /*.  
5070: 2a 2a 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f  **   PRAGMA enco
5080: 64 69 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47  ding.  **   PRAG
5090: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75  MA encoding = "u
50a0: 74 66 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22  tf-8"|"utf-16"|"
50b0: 75 74 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31  utf-16le"|"utf-1
50c0: 36 62 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  6be".  **.  ** I
50d0: 6e 20 69 74 27 73 20 66 69 72 73 74 20 66 6f 72  n it's first for
50e0: 6d 2c 20 74 68 69 73 20 70 72 61 67 6d 61 20 72  m, this pragma r
50f0: 65 74 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64  eturns the encod
5100: 69 6e 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a  ing of the main.
5110: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49    ** database. I
5120: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
5130: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  s not initialize
5140: 64 2c 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  d, it is initial
5150: 69 7a 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20  ized now..  **. 
5160: 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
5170: 6f 72 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67  orm of this prag
5180: 6d 61 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ma is a no-op if
5190: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
51a0: 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73  se file.  ** has
51b0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
51c0: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49  n initialized. I
51d0: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 73  n this case it s
51e0: 65 74 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a  ets the default.
51f0: 20 20 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68    ** encoding th
5200: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
5210: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
5220: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 61 20  abase file if a 
5230: 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  new file.  ** is
5240: 20 63 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20   created. If an 
5250: 65 78 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61  existing main da
5260: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
5270: 70 65 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  pened, then the.
5280: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78    ** default tex
5290: 74 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74  t encoding for t
52a0: 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
52b0: 62 61 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20  base is used..  
52c0: 2a 2a 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20  ** .  ** In all 
52d0: 63 61 73 65 73 20 6e 65 77 20 64 61 74 61 62 61  cases new databa
52e0: 73 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  ses created usin
52f0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
5300: 6d 61 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72  mand are.  ** cr
5310: 65 61 74 65 64 20 74 6f 20 75 73 65 20 74 68 65  eated to use the
5320: 20 73 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65   same default te
5330: 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74  xt encoding as t
5340: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
5350: 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61  . If.  ** the ma
5360: 69 6e 20 64 61 74 61 62 61 73 65 20 68 61 73 20  in database has 
5370: 6e 6f 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  not been initial
5380: 69 7a 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61  ized and/or crea
5390: 74 65 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a  ted when ATTACH.
53a0: 20 20 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64    ** is executed
53b0: 2c 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  , this is done b
53c0: 65 66 6f 72 65 20 74 68 65 20 41 54 54 41 43 48  efore the ATTACH
53d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a   operation..  **
53e0: 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63  .  ** In the sec
53f0: 6f 6e 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72  ond form this pr
5400: 61 67 6d 61 20 73 65 74 73 20 74 68 65 20 74 65  agma sets the te
5410: 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62  xt encoding to b
5420: 65 20 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e  e used in.  ** n
5430: 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
5440: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
5450: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61  this database ha
5460: 6e 64 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ndle. It is only
5470: 0a 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20  .  ** useful if 
5480: 69 6e 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74  invoked immediat
5490: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 6d 61  ely after the ma
54a0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 0a 20 20  in database i.  
54b0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
54c0: 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22  StrICmp(zLeft, "
54d0: 65 6e 63 6f 64 69 6e 67 22 29 3d 3d 30 20 29 7b  encoding")==0 ){
54e0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 6e 63 4e  .    struct EncN
54f0: 61 6d 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ame {.      char
5500: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75   *zName;.      u
5510: 38 20 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63  8 enc;.    } enc
5520: 6e 61 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  names[] = {.    
5530: 20 20 7b 20 22 55 54 46 2d 38 22 2c 20 20 20 20    { "UTF-8",    
5540: 53 51 4c 49 54 45 5f 55 54 46 38 20 20 20 20 20  SQLITE_UTF8     
5550: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55     },.      { "U
5560: 54 46 38 22 2c 20 20 20 20 20 53 51 4c 49 54 45  TF8",     SQLITE
5570: 5f 55 54 46 38 20 20 20 20 20 20 20 20 7d 2c 0a  _UTF8        },.
5580: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 6c        { "UTF-16l
5590: 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  e", SQLITE_UTF16
55a0: 4c 45 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  LE     },.      
55b0: 7b 20 22 55 54 46 31 36 6c 65 22 2c 20 20 53 51  { "UTF16le",  SQ
55c0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 20 20 20  LITE_UTF16LE    
55d0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46   },.      { "UTF
55e0: 2d 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55  -16be", SQLITE_U
55f0: 54 46 31 36 42 45 20 20 20 20 20 7d 2c 0a 20 20  TF16BE     },.  
5600: 20 20 20 20 7b 20 22 55 54 46 31 36 62 65 22 2c      { "UTF16be",
5610: 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45    SQLITE_UTF16BE
5620: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
5630: 22 55 54 46 2d 31 36 22 2c 20 20 20 30 20 2f 2a  "UTF-16",   0 /*
5640: 20 46 69 6c 6c 65 64 20 69 6e 20 61 74 20 72 75   Filled in at ru
5650: 6e 2d 74 69 6d 65 20 2a 2f 20 7d 2c 0a 20 20 20  n-time */ },.   
5660: 20 20 20 7b 20 22 55 54 46 31 36 22 2c 20 20 20     { "UTF16",   
5670: 20 30 20 2f 2a 20 46 69 6c 6c 65 64 20 69 6e 20   0 /* Filled in 
5680: 61 74 20 72 75 6e 2d 74 69 6d 65 20 2a 2f 20 7d  at run-time */ }
5690: 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d  ,.      { 0, 0 }
56a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 72 75  .    };.    stru
56b0: 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63  ct EncName *pEnc
56c0: 3b 0a 20 20 20 20 65 6e 63 6e 61 6d 65 73 5b 36  ;.    encnames[6
56d0: 5d 2e 65 6e 63 20 3d 20 65 6e 63 6e 61 6d 65 73  ].enc = encnames
56e0: 5b 37 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [7].enc = SQLITE
56f0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
5700: 20 20 69 66 28 20 21 7a 52 69 67 68 74 20 29 7b    if( !zRight ){
5710: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
5720: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
5730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
5740: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
5750: 29 20 67 6f 74 6f 20 70 72 61 67 6d 61 5f 6f 75  ) goto pragma_ou
5760: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
5770: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
5780: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
5790: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
57a0: 65 28 76 2c 20 30 2c 20 22 65 6e 63 6f 64 69 6e  e(v, 0, "encodin
57b0: 67 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  g", P3_STATIC);.
57c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
57d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
57e0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
57f0: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
5800: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
5810: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
5820: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 6e 63          if( pEnc
5830: 2d 3e 65 6e 63 3d 3d 70 50 61 72 73 65 2d 3e 64  ->enc==pParse->d
5840: 62 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  b->enc ){.      
5850: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5860: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
5870: 45 6e 63 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Enc->zName, P3_S
5880: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
5890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
58a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
58b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
58c0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
58d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 1, 0);.    }el
58e0: 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
58f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 50             /* "P
5900: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
5910: 20 58 58 58 22 20 2a 2f 0a 20 20 20 20 20 20 2f   XXX" */.      /
5920: 2a 20 4f 6e 6c 79 20 63 68 61 6e 67 65 20 74 68  * Only change th
5930: 65 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  e value of sqlit
5940: 65 2e 65 6e 63 20 69 66 20 74 68 65 20 64 61 74  e.enc if the dat
5950: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 69 73 20  abase handle is 
5960: 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69  not.      ** ini
5970: 74 69 61 6c 69 7a 65 64 2e 20 49 66 20 74 68 65  tialized. If the
5980: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
5990: 78 69 73 74 73 2c 20 74 68 65 20 6e 65 77 20 73  xists, the new s
59a0: 71 6c 69 74 65 2e 65 6e 63 20 76 61 6c 75 65 0a  qlite.enc value.
59b0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
59c0: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
59d0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  n the schema is 
59e0: 6e 65 78 74 20 6c 6f 61 64 65 64 2e 20 49 66 20  next loaded. If 
59f0: 69 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  it does not.    
5a00: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 69    ** already exi
5a10: 73 74 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  sts, it will be 
5a20: 63 72 65 61 74 65 64 20 74 6f 20 75 73 65 20 74  created to use t
5a30: 68 65 20 6e 65 77 20 65 6e 63 6f 64 69 6e 67 20  he new encoding 
5a40: 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  value..      */.
5a50: 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 72        if( !(pPar
5a60: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  se->db->flags&SQ
5a70: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
5a80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ) ){.        for
5a90: 28 70 45 6e 63 3d 26 65 6e 63 6e 61 6d 65 73 5b  (pEnc=&encnames[
5aa0: 30 5d 3b 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b  0]; pEnc->zName;
5ab0: 20 70 45 6e 63 2b 2b 29 7b 0a 20 20 20 20 20 20   pEnc++){.      
5ac0: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
5ad0: 65 33 53 74 72 49 43 6d 70 28 7a 52 69 67 68 74  e3StrICmp(zRight
5ae0: 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65 29 20 29  , pEnc->zName) )
5af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
5b00: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 20 3d 20  arse->db->enc = 
5b10: 70 45 6e 63 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  pEnc->enc;.     
5b20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5b30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5b50: 21 70 45 6e 63 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  !pEnc->zName ){.
5b60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5b70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5b80: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 65  , "unsupported e
5b90: 6e 63 6f 64 69 6e 67 3a 20 25 73 22 2c 20 7a 52  ncoding: %s", zR
5ba0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  ight);.        }
5bb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5bc0: 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69   }else..#if defi
5bd0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
5be0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
5bf0: 49 54 45 5f 54 45 53 54 29 0a 20 20 2f 2a 0a 20  ITE_TEST).  /*. 
5c00: 20 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63   ** Report the c
5c10: 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
5c20: 66 69 6c 65 20 6c 6f 67 73 20 66 6f 72 20 61 6c  file logs for al
5c30: 6c 20 64 61 74 61 62 61 73 65 73 0a 20 20 2a 2f  l databases.  */
5c40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5c50: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 6c 6f  rICmp(zLeft, "lo
5c60: 63 6b 5f 73 74 61 74 75 73 22 29 3d 3d 30 20 29  ck_status")==0 )
5c70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  {.    static cha
5c80: 72 20 2a 61 7a 4c 6f 63 6b 4e 61 6d 65 5b 5d 20  r *azLockName[] 
5c90: 3d 20 7b 0a 20 20 20 20 20 20 22 75 6e 6c 6f 63  = {.      "unloc
5ca0: 6b 65 64 22 2c 20 22 73 68 61 72 65 64 22 2c 20  ked", "shared", 
5cb0: 22 72 65 73 65 72 76 65 64 22 2c 20 22 70 65 6e  "reserved", "pen
5cc0: 64 69 6e 67 22 2c 20 22 65 78 63 6c 75 73 69 76  ding", "exclusiv
5cd0: 65 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  e".    };.    in
5ce0: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t i;.    Vdbe *v
5cf0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
5d00: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  e(pParse);.    s
5d10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
5d20: 43 6f 6c 73 28 76 2c 20 32 29 3b 0a 20 20 20 20  Cols(v, 2);.    
5d30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
5d40: 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 64 61 74  lName(v, 0, "dat
5d50: 61 62 61 73 65 22 2c 20 50 33 5f 53 54 41 54 49  abase", P3_STATI
5d60: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
5d70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
5d80: 20 31 2c 20 22 73 74 61 74 75 73 22 2c 20 50 33   1, "status", P3
5d90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f  _STATIC);.    fo
5da0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
5db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
5dc0: 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 20 20  ree *pBt;.      
5dd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
5de0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62       if( db->aDb
5df0: 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63  [i].zName==0 ) c
5e00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 73  ontinue;.      s
5e10: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
5e20: 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30   OP_String, 0, 0
5e30: 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  , db->aDb[i].zNa
5e40: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
5e50: 20 20 20 20 20 20 70 42 74 20 3d 20 64 62 2d 3e        pBt = db->
5e60: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
5e70: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 7c 7c 20    if( pBt==0 || 
5e80: 28 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  (pPager = sqlite
5e90: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
5ea0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5eb0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
5ec0: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
5ed0: 30 2c 20 22 63 6c 6f 73 65 64 22 2c 20 50 33 5f  0, "closed", P3_
5ee0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
5ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5f00: 74 20 6a 20 3d 20 73 71 6c 69 74 65 33 70 61 67  t j = sqlite3pag
5f10: 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 70 50 61  er_lockstate(pPa
5f20: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
5f30: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5f40: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
5f50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6a   .            (j
5f60: 3e 3d 30 20 26 26 20 6a 3c 3d 34 29 20 3f 20 61  >=0 && j<=4) ? a
5f70: 7a 4c 6f 63 6b 4e 61 6d 65 5b 6a 5d 20 3a 20 22  zLockName[j] : "
5f80: 75 6e 6b 6e 6f 77 6e 22 2c 20 50 33 5f 53 54 41  unknown", P3_STA
5f90: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
5fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5fb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
5fc0: 61 63 6b 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ack, 2, 0);.    
5fd0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
5fe0: 0a 0a 20 20 7b 7d 0a 70 72 61 67 6d 61 5f 6f 75  ..  {}.pragma_ou
5ff0: 74 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  t:.  sqliteFree(
6000: 7a 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  zLeft);.  sqlite
6010: 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a  Free(zRight);.}.