/ Hex Artifact Content
Login

Artifact 54b4d67fa81fd38b911aa3325348dcae9ceac5a4:


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 33 37 20 32 30  agma.c,v 1.37 20
01d0: 30 34 2f 30 36 2f 30 37 20 30 37 3a 35 32 3a 31  04/06/07 07:52:1
01e0: 38 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78  8 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 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
0230: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
0240: 6e 67 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20  ng as a boolean 
0250: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
0260: 20 69 6e 74 20 67 65 74 42 6f 6f 6c 65 61 6e 28   int getBoolean(
0270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0280: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
0290: 7a 54 72 75 65 5b 5d 20 3d 20 7b 20 22 79 65 73  zTrue[] = { "yes
02a0: 22 2c 20 22 6f 6e 22 2c 20 22 74 72 75 65 22 20  ", "on", "true" 
02b0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  };.  int i;.  if
02c0: 28 20 7a 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  ( z[0]==0 ) retu
02d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73 64 69  rn 0;.  if( isdi
02e0: 67 69 74 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b  git(z[0]) || (z[
02f0: 30 5d 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67  0]=='-' && isdig
0300: 69 74 28 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(z[1])) ){.   
0310: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 29 3b   return atoi(z);
0320: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
0330: 69 3c 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 29  i<sizeof(azTrue)
0340: 2f 73 69 7a 65 6f 66 28 61 7a 54 72 75 65 5b 30  /sizeof(azTrue[0
0350: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
0360: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
0370: 28 7a 2c 61 7a 54 72 75 65 5b 69 5d 29 3d 3d 30  (z,azTrue[i])==0
0380: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
0390: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
03a0: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
03b0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
03c0: 20 61 73 20 61 20 73 61 66 65 74 79 20 6c 65 76   as a safety lev
03d0: 65 6c 2e 20 20 52 65 74 75 72 6e 20 30 20 66 6f  el.  Return 0 fo
03e0: 72 20 4f 46 46 2c 0a 2a 2a 20 31 20 66 6f 72 20  r OFF,.** 1 for 
03f0: 4f 4e 20 6f 72 20 4e 4f 52 4d 41 4c 20 61 6e 64  ON or NORMAL and
0400: 20 32 20 66 6f 72 20 46 55 4c 4c 2e 20 20 52 65   2 for FULL.  Re
0410: 74 75 72 6e 20 31 20 66 6f 72 20 61 6e 20 65 6d  turn 1 for an em
0420: 70 74 79 20 6f 72 20 0a 2a 2a 20 75 6e 72 65 63  pty or .** unrec
0430: 6f 67 6e 69 7a 65 64 20 73 74 72 69 6e 67 20 61  ognized string a
0440: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  rgument..**.** N
0450: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 61 6c  ote that the val
0460: 75 65 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ues returned are
0470: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 74 20 74   one less that t
0480: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 0a 2a  he values that.*
0490: 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  * should be pass
04a0: 65 64 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 42  ed into sqlite3B
04b0: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
04c0: 65 6c 28 29 2e 20 20 54 68 65 20 69 73 20 64 6f  el().  The is do
04d0: 6e 65 0a 2a 2a 20 74 6f 20 73 75 70 70 6f 72 74  ne.** to support
04e0: 20 6c 65 67 61 63 79 20 53 51 4c 20 63 6f 64 65   legacy SQL code
04f0: 2e 20 20 54 68 65 20 73 61 66 65 74 79 20 6c 65  .  The safety le
0500: 76 65 6c 20 75 73 65 64 20 74 6f 20 62 65 20 62  vel used to be b
0510: 6f 6f 6c 65 61 6e 0a 2a 2a 20 61 6e 64 20 6f 6c  oolean.** and ol
0520: 64 65 72 20 73 63 72 69 70 74 73 20 6d 61 79 20  der scripts may 
0530: 68 61 76 65 20 75 73 65 64 20 6e 75 6d 62 65 72  have used number
0540: 73 20 30 20 66 6f 72 20 4f 46 46 20 61 6e 64 20  s 0 for OFF and 
0550: 31 20 66 6f 72 20 4f 4e 2e 0a 2a 2f 0a 73 74 61  1 for ON..*/.sta
0560: 74 69 63 20 69 6e 74 20 67 65 74 53 61 66 65 74  tic int getSafet
0570: 79 4c 65 76 65 6c 28 63 68 61 72 20 2a 7a 29 7b  yLevel(char *z){
0580: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0590: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
05a0: 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 3b 0a  st char *zWord;.
05b0: 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 7d      int val;.  }
05c0: 20 61 4b 65 79 5b 5d 20 3d 20 7b 0a 20 20 20 20   aKey[] = {.    
05d0: 7b 20 22 6e 6f 22 2c 20 20 20 20 30 20 7d 2c 0a  { "no",    0 },.
05e0: 20 20 20 20 7b 20 22 6f 66 66 22 2c 20 20 20 30      { "off",   0
05f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 6c 73 65   },.    { "false
0600: 22 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 79  ", 0 },.    { "y
0610: 65 73 22 2c 20 20 20 31 20 7d 2c 0a 20 20 20 20  es",   1 },.    
0620: 7b 20 22 6f 6e 22 2c 20 20 20 20 31 20 7d 2c 0a  { "on",    1 },.
0630: 20 20 20 20 7b 20 22 74 72 75 65 22 2c 20 20 31      { "true",  1
0640: 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 6c 6c 22   },.    { "full"
0650: 2c 20 20 32 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  ,  2 },.  };.  i
0660: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d  nt i;.  if( z[0]
0670: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
0680: 20 20 69 66 28 20 69 73 64 69 67 69 74 28 7a 5b    if( isdigit(z[
0690: 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2d  0]) || (z[0]=='-
06a0: 27 20 26 26 20 69 73 64 69 67 69 74 28 7a 5b 31  ' && isdigit(z[1
06b0: 5d 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ])) ){.    retur
06c0: 6e 20 61 74 6f 69 28 7a 29 3b 0a 20 20 7d 0a 20  n atoi(z);.  }. 
06d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
06e0: 6f 66 28 61 4b 65 79 29 2f 73 69 7a 65 6f 66 28  of(aKey)/sizeof(
06f0: 61 4b 65 79 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aKey[0]); i++){.
0700: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
0710: 74 72 49 43 6d 70 28 7a 2c 61 4b 65 79 5b 69 5d  trICmp(z,aKey[i]
0720: 2e 7a 57 6f 72 64 29 3d 3d 30 20 29 20 72 65 74  .zWord)==0 ) ret
0730: 75 72 6e 20 61 4b 65 79 5b 69 5d 2e 76 61 6c 3b  urn aKey[i].val;
0740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
0750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70  .}../*.** Interp
0760: 72 65 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  ret the given st
0770: 72 69 6e 67 20 61 73 20 61 20 74 65 6d 70 20 64  ring as a temp d
0780: 62 20 6c 6f 63 61 74 69 6f 6e 2e 20 52 65 74 75  b location. Retu
0790: 72 6e 20 31 20 66 6f 72 20 66 69 6c 65 0a 2a 2a  rn 1 for file.**
07a0: 20 62 61 63 6b 65 64 20 74 65 6d 70 6f 72 61 72   backed temporar
07b0: 79 20 64 61 74 61 62 61 73 65 73 2c 20 32 20 66  y databases, 2 f
07c0: 6f 72 20 74 68 65 20 52 65 64 2d 42 6c 61 63 6b  or the Red-Black
07d0: 20 74 72 65 65 20 69 6e 20 6d 65 6d 6f 72 79 20   tree in memory 
07e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64 20  database.** and 
07f0: 30 20 74 6f 20 75 73 65 20 74 68 65 20 63 6f 6d  0 to use the com
0800: 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c  pile-time defaul
0810: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
0820: 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28 63 6f   getTempStore(co
0830: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
0840: 69 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26  if( z[0]>='0' &&
0850: 20 7a 5b 30 5d 3c 3d 27 32 27 20 29 7b 0a 20 20   z[0]<='2' ){.  
0860: 20 20 72 65 74 75 72 6e 20 7a 5b 30 5d 20 2d 20    return z[0] - 
0870: 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  '0';.  }else if(
0880: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
0890: 7a 2c 20 22 66 69 6c 65 22 29 3d 3d 30 20 29 7b  z, "file")==0 ){
08a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
08b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
08c0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 6d 65  e3StrICmp(z, "me
08d0: 6d 6f 72 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  mory")==0 ){.   
08e0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 65 6c   return 2;.  }el
08f0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
0900: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
0910: 66 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  f the TEMP datab
0920: 61 73 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f  ase is open, clo
0930: 73 65 20 69 74 20 61 6e 64 20 6d 61 72 6b 20 74  se it and mark t
0940: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
0950: 6d 61 0a 2a 2a 20 61 73 20 6e 65 65 64 69 6e 67  ma.** as needing
0960: 20 72 65 6c 6f 61 64 69 6e 67 2e 20 20 54 68 69   reloading.  Thi
0970: 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
0980: 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 54 45  hen using the TE
0990: 4d 50 5f 53 54 4f 52 45 0a 2a 2a 20 6f 72 20 44  MP_STORE.** or D
09a0: 45 46 41 55 4c 54 5f 54 45 4d 50 5f 53 54 4f 52  EFAULT_TEMP_STOR
09b0: 45 20 70 72 61 67 6d 61 73 2e 0a 2a 2f 0a 73 74  E pragmas..*/.st
09c0: 61 74 69 63 20 69 6e 74 20 63 68 61 6e 67 65 54  atic int changeT
09d0: 65 6d 70 53 74 6f 72 61 67 65 28 50 61 72 73 65  empStorage(Parse
09e0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
09f0: 63 68 61 72 20 2a 7a 53 74 6f 72 61 67 65 54 79  char *zStorageTy
0a00: 70 65 29 7b 0a 20 20 69 6e 74 20 74 73 20 3d 20  pe){.  int ts = 
0a10: 67 65 74 54 65 6d 70 53 74 6f 72 65 28 7a 53 74  getTempStore(zSt
0a20: 6f 72 61 67 65 54 79 70 65 29 3b 0a 20 20 73 71  orageType);.  sq
0a30: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
0a40: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0a50: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 74 73 20  >temp_store==ts 
0a60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
0a70: 4f 4b 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  OK;.  if( db->aD
0a80: 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
0a90: 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
0aa0: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
0ab0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
0ac0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
0ad0: 72 79 20 73 74 6f 72 61 67 65 20 63 61 6e 6e 6f  ry storage canno
0ae0: 74 20 62 65 20 63 68 61 6e 67 65 64 20 22 0a 20  t be changed ". 
0af0: 20 20 20 20 20 20 20 22 66 72 6f 6d 20 77 69 74         "from wit
0b00: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
0b10: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
0b20: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
0b30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
0b40: 33 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e  3BtreeClose(db->
0b50: 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[1].pBt);.   
0b60: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
0b70: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
0b80: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
0b90: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
0ba0: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
0bb0: 20 3d 20 74 73 3b 0a 20 20 72 65 74 75 72 6e 20   = ts;.  return 
0bc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
0bd0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0be0: 20 69 66 20 7a 52 69 67 68 74 20 61 6e 64 20 7a   if zRight and z
0bf0: 4c 65 66 74 20 72 65 66 65 72 20 74 6f 20 61 20  Left refer to a 
0c00: 70 72 61 67 6d 61 20 74 68 61 74 20 71 75 65 72  pragma that quer
0c10: 69 65 73 0a 2a 2a 20 6f 72 20 63 68 61 6e 67 65  ies.** or change
0c20: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6c 61  s one of the fla
0c30: 67 73 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  gs in db->flags.
0c40: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 73 6f    Return 1 if so
0c50: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0c60: 2a 20 41 6c 73 6f 2c 20 69 6d 70 6c 65 6d 65 6e  * Also, implemen
0c70: 74 20 74 68 65 20 70 72 61 67 6d 61 2e 0a 2a 2f  t the pragma..*/
0c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 67  .static int flag
0c90: 50 72 61 67 6d 61 28 50 61 72 73 65 20 2a 70 50  Pragma(Parse *pP
0ca0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
0cb0: 20 2a 7a 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63   *zLeft, const c
0cc0: 68 61 72 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20  har *zRight){.  
0cd0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
0ce0: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
0cf0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 2f 2a  char *zName;  /*
0d00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 61   Name of the pra
0d10: 67 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  gma */.    int m
0d20: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ask;           /
0d30: 2a 20 4d 61 73 6b 20 66 6f 72 20 74 68 65 20 64  * Mask for the d
0d40: 62 2d 3e 66 6c 61 67 73 20 76 61 6c 75 65 20 2a  b->flags value *
0d50: 2f 0a 20 20 7d 20 61 50 72 61 67 6d 61 5b 5d 20  /.  } aPragma[] 
0d60: 3d 20 7b 0a 20 20 20 20 7b 20 22 76 64 62 65 5f  = {.    { "vdbe_
0d70: 74 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  trace",         
0d80: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 56 64 62        SQLITE_Vdb
0d90: 65 54 72 61 63 65 20 20 20 20 20 7d 2c 0a 20 20  eTrace     },.  
0da0: 20 20 7b 20 22 66 75 6c 6c 5f 63 6f 6c 75 6d 6e    { "full_column
0db0: 5f 6e 61 6d 65 73 22 2c 20 20 20 20 20 20 20 20  _names",        
0dc0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
0dd0: 6d 65 73 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73  mes  },.    { "s
0de0: 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
0df0: 73 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  s",       SQLITE
0e00: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7d  _ShortColNames }
0e10: 2c 0a 20 20 20 20 7b 20 22 63 6f 75 6e 74 5f 63  ,.    { "count_c
0e20: 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
0e30: 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74      SQLITE_Count
0e40: 52 6f 77 73 20 20 20 20 20 7d 2c 0a 20 20 20 20  Rows     },.    
0e50: 7b 20 22 65 6d 70 74 79 5f 72 65 73 75 6c 74 5f  { "empty_result_
0e60: 63 61 6c 6c 62 61 63 6b 73 22 2c 20 20 20 53 51  callbacks",   SQ
0e70: 4c 49 54 45 5f 4e 75 6c 6c 43 61 6c 6c 62 61 63  LITE_NullCallbac
0e80: 6b 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  k  },.  };.  int
0e90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
0ea0: 3c 73 69 7a 65 6f 66 28 61 50 72 61 67 6d 61 29  <sizeof(aPragma)
0eb0: 2f 73 69 7a 65 6f 66 28 61 50 72 61 67 6d 61 5b  /sizeof(aPragma[
0ec0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
0ed0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
0ee0: 70 28 7a 4c 65 66 74 2c 20 61 50 72 61 67 6d 61  p(zLeft, aPragma
0ef0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
0f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 20 2a 64  .      sqlite *d
0f10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0f20: 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20        Vdbe *v;. 
0f30: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
0f40: 7a 4c 65 66 74 2c 7a 52 69 67 68 74 29 3d 3d 30  zLeft,zRight)==0
0f50: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
0f60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
0f70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
0f80: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
0f90: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
0fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
0fb0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
0fc0: 61 50 72 61 67 6d 61 5b 69 5d 2e 7a 4e 61 6d 65  aPragma[i].zName
0fd0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
0fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
0ff0: 65 43 6f 64 65 28 76 2c 20 4f 50 5f 49 6e 74 65  eCode(v, OP_Inte
1000: 67 65 72 2c 20 28 64 62 2d 3e 66 6c 61 67 73 20  ger, (db->flags 
1010: 26 20 61 50 72 61 67 6d 61 5b 69 5d 2e 6d 61 73  & aPragma[i].mas
1020: 6b 29 21 3d 30 2c 20 30 2c 0a 20 20 20 20 20 20  k)!=0, 0,.      
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c      OP_Callback,
1050: 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   1, 0, 0);.     
1060: 20 7d 65 6c 73 65 20 69 66 28 20 67 65 74 42 6f   }else if( getBo
1070: 6f 6c 65 61 6e 28 7a 52 69 67 68 74 29 20 29 7b  olean(zRight) ){
1080: 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  .        db->fla
1090: 67 73 20 7c 3d 20 61 50 72 61 67 6d 61 5b 69 5d  gs |= aPragma[i]
10a0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  .mask;.      }el
10b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
10c0: 66 6c 61 67 73 20 26 3d 20 7e 61 50 72 61 67 6d  flags &= ~aPragm
10d0: 61 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  a[i].mask;.     
10e0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
10f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1100: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1110: 2a 20 50 72 6f 63 65 73 73 20 61 20 70 72 61 67  * Process a prag
1120: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  ma statement.  .
1130: 2a 2a 0a 2a 2a 20 50 72 61 67 6d 61 73 20 61 72  **.** Pragmas ar
1140: 65 20 6f 66 20 74 68 69 73 20 66 6f 72 6d 3a 0a  e of this form:.
1150: 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 52 41 47 4d  **.**      PRAGM
1160: 41 20 69 64 20 3d 20 76 61 6c 75 65 0a 2a 2a 0a  A id = value.**.
1170: 2a 2a 20 54 68 65 20 69 64 65 6e 74 69 66 69 65  ** The identifie
1180: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  r might also be 
1190: 61 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 76  a string.  The v
11a0: 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
11b0: 2c 20 61 6e 64 0a 2a 2a 20 69 64 65 6e 74 69 66  , and.** identif
11c0: 69 65 72 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72  ier, or a number
11d0: 2e 20 20 49 66 20 6d 69 6e 75 73 46 6c 61 67 20  .  If minusFlag 
11e0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
11f0: 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 20  e value is.** a 
1200: 6e 75 6d 62 65 72 20 74 68 61 74 20 77 61 73 20  number that was 
1210: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
1220: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2f 0a 76 6f 69  nus sign..*/.voi
1230: 64 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28  d sqlite3Pragma(
1240: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1250: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
1260: 65 6e 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  en *pRight, int 
1270: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 63 68  minusFlag){.  ch
1280: 61 72 20 2a 7a 4c 65 66 74 20 3d 20 30 3b 0a 20  ar *zLeft = 0;. 
1290: 20 63 68 61 72 20 2a 7a 52 69 67 68 74 20 3d 20   char *zRight = 
12a0: 30 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  0;.  sqlite *db 
12b0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
12c0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
12d0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12e0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
12f0: 65 74 75 72 6e 3b 0a 0a 20 20 7a 4c 65 66 74 20  eturn;..  zLeft 
1300: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
1310: 70 4c 65 66 74 2d 3e 7a 2c 20 70 4c 65 66 74 2d  pLeft->z, pLeft-
1320: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  >n);.  sqlite3De
1330: 71 75 6f 74 65 28 7a 4c 65 66 74 29 3b 0a 20 20  quote(zLeft);.  
1340: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
1350: 0a 20 20 20 20 7a 52 69 67 68 74 20 3d 20 30 3b  .    zRight = 0;
1360: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
1370: 53 74 72 69 6e 67 28 26 7a 52 69 67 68 74 2c 20  String(&zRight, 
1380: 22 2d 22 2c 20 31 2c 20 70 52 69 67 68 74 2d 3e  "-", 1, pRight->
1390: 7a 2c 20 70 52 69 67 68 74 2d 3e 6e 2c 20 30 29  z, pRight->n, 0)
13a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
13b0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 53 74  Right = sqliteSt
13c0: 72 4e 44 75 70 28 70 52 69 67 68 74 2d 3e 7a 2c  rNDup(pRight->z,
13d0: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 20   pRight->n);.   
13e0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
13f0: 7a 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  zRight);.  }.  i
1400: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1410: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1420: 54 45 5f 50 52 41 47 4d 41 2c 20 7a 4c 65 66 74  TE_PRAGMA, zLeft
1430: 2c 20 7a 52 69 67 68 74 2c 20 30 29 20 29 7b 0a  , zRight, 0) ){.
1440: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1450: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1460: 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a 20  eFree(zRight);. 
1470: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1480: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
1490: 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65  MA default_cache
14a0: 5f 73 69 7a 65 0a 20 20 2a 2a 20 20 50 52 41 47  _size.  **  PRAG
14b0: 4d 41 20 64 65 66 61 75 6c 74 5f 63 61 63 68 65  MA default_cache
14c0: 5f 73 69 7a 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a  _size=N.  **.  *
14d0: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
14e0: 20 72 65 70 6f 72 74 73 20 74 68 65 20 63 75 72   reports the cur
14f0: 72 65 6e 74 20 70 65 72 73 69 73 74 65 6e 74 20  rent persistent 
1500: 73 65 74 74 69 6e 67 20 66 6f 72 20 74 68 65 0a  setting for the.
1510: 20 20 2a 2a 20 70 61 67 65 20 63 61 63 68 65 20    ** page cache 
1520: 73 69 7a 65 2e 20 20 54 68 65 20 76 61 6c 75 65  size.  The value
1530: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
1540: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
1550: 6f 66 0a 20 20 2a 2a 20 70 61 67 65 73 20 69 6e  of.  ** pages in
1560: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1570: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
1580: 6d 20 73 65 74 73 20 62 6f 74 68 20 74 68 65 20  m sets both the 
1590: 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
15a0: 65 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c  e cache size val
15b0: 75 65 20 61 6e 64 20 74 68 65 20 70 65 72 73 69  ue and the persi
15c0: 73 74 65 6e 74 20 70 61 67 65 20 63 61 63 68 65  stent page cache
15d0: 20 73 69 7a 65 20 76 61 6c 75 65 0a 20 20 2a 2a   size value.  **
15e0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
15f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1600: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 65 66 61  **.  ** The defa
1610: 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 20 69  ult cache size i
1620: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 74 61  s stored in meta
1630: 2d 76 61 6c 75 65 20 32 20 6f 66 20 70 61 67 65  -value 2 of page
1640: 20 31 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64   1 of the.  ** d
1650: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
1660: 68 65 20 63 61 63 68 65 20 73 69 7a 65 20 69 73  he cache size is
1670: 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 61 62   actually the ab
1680: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 0a  solute value of.
1690: 20 20 2a 2a 20 74 68 69 73 20 6d 65 6d 6f 72 79    ** this memory
16a0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20   location.  The 
16b0: 73 69 67 6e 20 6f 66 20 6d 65 74 61 2d 76 61 6c  sign of meta-val
16c0: 75 65 20 32 20 64 65 74 65 72 6d 69 6e 65 73 20  ue 2 determines 
16d0: 74 68 65 0a 20 20 2a 2a 20 73 79 6e 63 68 72 6f  the.  ** synchro
16e0: 6e 6f 75 73 20 73 65 74 74 69 6e 67 2e 20 20 41  nous setting.  A
16f0: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
1700: 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f 6e 6f 75  means synchronou
1710: 73 20 69 73 20 6f 66 66 0a 20 20 2a 2a 20 61 6e  s is off.  ** an
1720: 64 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  d a positive val
1730: 75 65 20 6d 65 61 6e 73 20 73 79 6e 63 68 72 6f  ue means synchro
1740: 6e 6f 75 73 20 69 73 20 6f 6e 2e 0a 20 20 2a 2f  nous is on..  */
1750: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1760: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22 64 65 66  rICmp(zLeft,"def
1770: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 22  ault_cache_size"
1780: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
1790: 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 67 65  ic VdbeOpList ge
17a0: 74 43 61 63 68 65 53 69 7a 65 5b 5d 20 3d 20 7b  tCacheSize[] = {
17b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64  .      { OP_Read
17c0: 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32 2c 20 20  Cookie,  0, 2,  
17d0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
17e0: 7b 20 4f 50 5f 41 62 73 56 61 6c 75 65 2c 20 20  { OP_AbsValue,  
17f0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
1800: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 75  },.      { OP_Du
1810: 70 2c 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c  p,         0, 0,
1820: 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
1830: 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20    { OP_Integer, 
1840: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
1850: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
1860: 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  Ne,          0, 
1870: 36 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  6,        0},.  
1880: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
1890: 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
18a0: 20 20 20 30 7d 2c 20 20 2f 2a 20 35 20 2a 2f 0a     0},  /* 5 */.
18b0: 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62        { OP_Callb
18c0: 61 63 6b 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  ack,    1, 0,   
18d0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a       0},.    };.
18e0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
18f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1900: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1910: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29  ma(pParse->db) )
1920: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28   return;.    if(
1930: 20 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66   pRight->z==pLef
1940: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  t->z ){.      sq
1950: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
1960: 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  ols(v, 1);.     
1970: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
1980: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 63 61  olName(v, 0, "ca
1990: 63 68 65 5f 73 69 7a 65 22 2c 20 50 33 5f 53 54  che_size", P3_ST
19a0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 61 64 64  ATIC);.      add
19b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
19c0: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
19d0: 79 53 69 7a 65 28 67 65 74 43 61 63 68 65 53 69  ySize(getCacheSi
19e0: 7a 65 29 2c 20 67 65 74 43 61 63 68 65 53 69 7a  ze), getCacheSiz
19f0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1a00: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
1a10: 20 61 64 64 72 2b 35 2c 20 4d 41 58 5f 50 41 47   addr+5, MAX_PAG
1a20: 45 53 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ES);.    }else{.
1a30: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
1a40: 20 61 74 6f 69 28 7a 52 69 67 68 74 29 3b 0a 20   atoi(zRight);. 
1a50: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30 20       if( size<0 
1a60: 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b 0a  ) size = -size;.
1a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1a80: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1a90: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
1aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
1ac0: 65 67 65 72 2c 20 73 69 7a 65 2c 20 30 29 3b 0a  eger, size, 0);.
1ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ae0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61  eAddOp(v, OP_Rea
1af0: 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a  dCookie, 0, 2);.
1b00: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
1b10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1b20: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1b30: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1b40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b50: 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33 29 3b  _Ge, 0, addr+3);
1b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
1b80: 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20  gative, 0, 0);. 
1b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ba0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
1bb0: 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
1bc0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
1bd0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1be0: 72 73 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  rse);.      db->
1bf0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 64 62 2d  cache_size = db-
1c00: 3e 63 61 63 68 65 5f 73 69 7a 65 3c 30 20 3f 20  >cache_size<0 ? 
1c10: 2d 73 69 7a 65 20 3a 20 73 69 7a 65 3b 0a 20 20  -size : size;.  
1c20: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c30: 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
1c40: 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d  >aDb[0].pBt, db-
1c50: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
1c60: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
1c70: 2a 0a 20 20 2a 2a 20 20 50 52 41 47 4d 41 20 63  *.  **  PRAGMA c
1c80: 61 63 68 65 5f 73 69 7a 65 0a 20 20 2a 2a 20 20  ache_size.  **  
1c90: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1ca0: 65 3d 4e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e=N.  **.  ** Th
1cb0: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 72 65 70  e first form rep
1cc0: 6f 72 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  orts the current
1cd0: 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20 66   local setting f
1ce0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  or the.  ** page
1cf0: 20 63 61 63 68 65 20 73 69 7a 65 2e 20 20 54 68   cache size.  Th
1d00: 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67 20  e local setting 
1d10: 63 61 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74  can be different
1d20: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 70   from.  ** the p
1d30: 65 72 73 69 73 74 65 6e 74 20 63 61 63 68 65 20  ersistent cache 
1d40: 73 69 7a 65 20 76 61 6c 75 65 20 74 68 61 74 20  size value that 
1d50: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1d60: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
1d70: 69 6c 65 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ile itself.  The
1d80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1d90: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  is the maximum n
1da0: 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 70 61  umber of.  ** pa
1db0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
1dc0: 63 61 63 68 65 2e 20 20 54 68 65 20 73 65 63 6f  cache.  The seco
1dd0: 6e 64 20 66 6f 72 6d 20 73 65 74 73 20 74 68 65  nd form sets the
1de0: 20 6c 6f 63 61 6c 0a 20 20 2a 2a 20 70 61 67 65   local.  ** page
1df0: 20 63 61 63 68 65 20 73 69 7a 65 20 76 61 6c 75   cache size valu
1e00: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
1e10: 63 68 61 6e 67 65 20 74 68 65 20 70 65 72 73 69  change the persi
1e20: 73 74 65 6e 74 0a 20 20 2a 2a 20 63 61 63 68 65  stent.  ** cache
1e30: 20 73 69 7a 65 20 73 74 6f 72 65 64 20 6f 6e 20   size stored on 
1e40: 74 68 65 20 64 69 73 6b 20 73 6f 20 74 68 65 20  the disk so the 
1e50: 63 61 63 68 65 20 73 69 7a 65 20 77 69 6c 6c 20  cache size will 
1e60: 72 65 76 65 72 74 0a 20 20 2a 2a 20 74 6f 20 69  revert.  ** to i
1e70: 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ts default value
1e80: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
1e90: 73 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  se is closed and
1ea0: 20 72 65 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 20   reopened..  ** 
1eb0: 4e 20 73 68 6f 75 6c 64 20 62 65 20 61 20 70 6f  N should be a po
1ec0: 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2e 0a  sitive integer..
1ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
1ee0: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
1ef0: 22 63 61 63 68 65 5f 73 69 7a 65 22 29 3d 3d 30  "cache_size")==0
1f00: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
1f10: 64 62 65 4f 70 4c 69 73 74 20 67 65 74 43 61 63  dbeOpList getCac
1f20: 68 65 53 69 7a 65 5b 5d 20 3d 20 7b 0a 20 20 20  heSize[] = {.   
1f30: 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b     { OP_Callback
1f40: 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
1f50: 20 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20    0},.    };.   
1f60: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1f70: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1f80: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 20  a(pParse->db) ) 
1f90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
1fa0: 70 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74  pRight->z==pLeft
1fb0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ->z ){.      int
1fc0: 20 73 69 7a 65 20 3d 20 64 62 2d 3e 63 61 63 68   size = db->cach
1fd0: 65 5f 73 69 7a 65 3b 3b 0a 20 20 20 20 20 20 69  e_size;;.      i
1fe0: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
1ff0: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
2000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2010: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2020: 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  size, 0);.      
2030: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
2040: 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20  mCols(v, 1);.   
2050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
2060: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22  tColName(v, 0, "
2070: 63 61 63 68 65 5f 73 69 7a 65 22 2c 20 50 33 5f  cache_size", P3_
2080: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
2090: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
20a0: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
20b0: 28 67 65 74 43 61 63 68 65 53 69 7a 65 29 2c 20  (getCacheSize), 
20c0: 67 65 74 43 61 63 68 65 53 69 7a 65 29 3b 0a 20  getCacheSize);. 
20d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e0: 69 6e 74 20 73 69 7a 65 20 3d 20 61 74 6f 69 28  int size = atoi(
20f0: 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 69  zRight);.      i
2100: 66 28 20 73 69 7a 65 3c 30 20 29 20 73 69 7a 65  f( size<0 ) size
2110: 20 3d 20 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20   = -size;.      
2120: 69 66 28 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  if( db->cache_si
2130: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
2140: 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 63  ize;.      db->c
2150: 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  ache_size = size
2160: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
2170: 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
2180: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
2190: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29   db->cache_size)
21a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
21b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 50 52 41 47  .  /*.  **  PRAG
21c0: 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63 68  MA default_synch
21d0: 72 6f 6e 6f 75 73 0a 20 20 2a 2a 20 20 50 52 41  ronous.  **  PRA
21e0: 47 4d 41 20 64 65 66 61 75 6c 74 5f 73 79 6e 63  GMA default_sync
21f0: 68 72 6f 6e 6f 75 73 3d 4f 4e 7c 4f 46 46 7c 4e  hronous=ON|OFF|N
2200: 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a 2a 0a  ORMAL|FULL.  **.
2210: 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66    ** The first f
2220: 6f 72 6d 20 72 65 74 75 72 6e 73 20 74 68 65 20  orm returns the 
2230: 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65  persistent value
2240: 20 6f 66 20 74 68 65 20 22 73 79 6e 63 68 72 6f   of the "synchro
2250: 6e 6f 75 73 22 20 73 65 74 74 69 6e 67 0a 20 20  nous" setting.  
2260: 2a 2a 20 74 68 61 74 20 69 73 20 73 74 6f 72 65  ** that is store
2270: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2280: 65 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  e.  This is the 
2290: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 74 74  synchronous sett
22a0: 69 6e 67 20 74 68 61 74 0a 20 20 2a 2a 20 69 73  ing that.  ** is
22b0: 20 75 73 65 64 20 77 68 65 6e 65 76 65 72 20 74   used whenever t
22c0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
22d0: 70 65 6e 65 64 20 75 6e 6c 65 73 73 20 6f 76 65  pened unless ove
22e0: 72 72 69 64 64 65 6e 20 62 79 20 61 20 73 65 70  rridden by a sep
22f0: 61 72 61 74 65 0a 20 20 2a 2a 20 22 73 79 6e 63  arate.  ** "sync
2300: 68 72 6f 6e 6f 75 73 22 20 70 72 61 67 6d 61 2e  hronous" pragma.
2310: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
2320: 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 70 65  m changes the pe
2330: 72 73 69 73 74 65 6e 74 20 61 6e 64 20 74 68 65  rsistent and the
2340: 0a 20 20 2a 2a 20 6c 6f 63 61 6c 20 73 79 6e 63  .  ** local sync
2350: 68 72 6f 6e 6f 75 73 20 73 65 74 74 69 6e 67 20  hronous setting 
2360: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 67 69 76  to the value giv
2370: 65 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  en..  **.  ** If
2380: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
2390: 4f 46 46 2c 20 53 51 4c 69 74 65 20 64 6f 65 73  OFF, SQLite does
23a0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 61 6e 79   not attempt any
23b0: 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 73   fsync() systems
23c0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 6d   calls.  ** to m
23d0: 61 6b 65 20 73 75 72 65 20 64 61 74 61 20 69 73  ake sure data is
23e0: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
23f0: 73 6b 2e 20 20 57 72 69 74 65 20 6f 70 65 72 61  sk.  Write opera
2400: 74 69 6f 6e 73 20 61 72 65 20 76 65 72 79 20 66  tions are very f
2410: 61 73 74 2c 0a 20 20 2a 2a 20 62 75 74 20 61 20  ast,.  ** but a 
2420: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 61  power failure ca
2430: 6e 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  n leave the data
2440: 62 61 73 65 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  base in an incon
2450: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
2460: 20 2a 2a 20 49 66 20 73 79 6e 63 68 72 6f 6e 6f   ** If synchrono
2470: 75 73 20 69 73 20 4f 4e 20 6f 72 20 4e 4f 52 4d  us is ON or NORM
2480: 41 4c 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  AL, SQLite will 
2490: 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 73 79  do an fsync() sy
24a0: 73 74 65 6d 20 63 61 6c 6c 20 74 6f 0a 20 20 2a  stem call to.  *
24b0: 2a 20 6d 61 6b 65 20 73 75 72 65 20 64 61 74 61  * make sure data
24c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
24d0: 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 65 20  n to disk.  The 
24e0: 72 69 73 6b 20 6f 66 20 63 6f 72 72 75 70 74 69  risk of corrupti
24f0: 6f 6e 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 61  on due to.  ** a
2500: 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74   power loss in t
2510: 68 69 73 20 6d 6f 64 65 20 69 73 20 6e 65 67 6c  his mode is negl
2520: 69 67 69 62 6c 65 20 62 75 74 20 6e 6f 6e 2d 7a  igible but non-z
2530: 65 72 6f 2e 20 20 49 66 20 73 79 6e 63 68 72 6f  ero.  If synchro
2540: 6e 6f 75 73 0a 20 20 2a 2a 20 69 73 20 46 55 4c  nous.  ** is FUL
2550: 4c 2c 20 65 78 74 72 61 20 66 73 79 6e 63 28 29  L, extra fsync()
2560: 73 20 6f 63 63 75 72 20 74 6f 20 72 65 64 75 63  s occur to reduc
2570: 65 20 74 68 65 20 72 69 73 6b 20 6f 66 20 63 6f  e the risk of co
2580: 72 72 75 70 74 69 6f 6e 20 74 6f 20 6e 65 61 72  rruption to near
2590: 0a 20 20 2a 2a 20 7a 65 72 6f 2c 20 62 75 74 20  .  ** zero, but 
25a0: 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
25b0: 66 6f 72 6d 61 6e 63 65 20 70 65 6e 61 6c 74 79  formance penalty
25c0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 6d  .  The default m
25d0: 6f 64 65 20 69 73 20 4e 4f 52 4d 41 4c 2e 0a 20  ode is NORMAL.. 
25e0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
25f0: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 22  3StrICmp(zLeft,"
2600: 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f 6e  default_synchron
2610: 6f 75 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ous")==0 ){.    
2620: 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69 73  static VdbeOpLis
2630: 74 20 67 65 74 53 79 6e 63 5b 5d 20 3d 20 7b 0a  t getSync[] = {.
2640: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
2650: 6f 6f 6b 69 65 2c 20 20 30 2c 20 33 2c 20 20 20  ookie,  0, 3,   
2660: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
2670: 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20 20   OP_Dup,        
2680: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
2690: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 49 66 2c  ,.      { OP_If,
26a0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
26b0: 20 20 20 20 20 20 20 30 7d 2c 20 20 2f 2a 20 32         0},  /* 2
26c0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52   */.      { OP_R
26d0: 65 61 64 43 6f 6f 6b 69 65 2c 20 20 30 2c 20 32  eadCookie,  0, 2
26e0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
26f0: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
2700: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
2710: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
2720: 5f 4c 74 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Lt,          0,
2730: 20 35 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   5,        0},. 
2740: 20 20 20 20 20 7b 20 4f 50 5f 41 64 64 49 6d 6d       { OP_AddImm
2750: 2c 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 20  ,      1, 0,    
2760: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
2770: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
2780: 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  1, 0,        0},
2790: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74  .      { OP_Halt
27a0: 2c 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 20  ,        0, 0,  
27b0: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
27c0: 7b 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 20 20 20  { OP_AddImm,    
27d0: 20 2d 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30   -1, 0,        0
27e0: 7d 2c 20 20 2f 2a 20 39 20 2a 2f 0a 20 20 20 20  },  /* 9 */.    
27f0: 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
2800: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
2810: 20 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   0}.    };.    i
2820: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 66 28  nt addr;.    if(
2830: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
2840: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
2850: 61 72 73 65 2d 3e 64 62 29 20 29 20 72 65 74 75  arse->db) ) retu
2860: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67  rn;.    if( pRig
2870: 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20  ht->z==pLeft->z 
2880: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2890: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
28a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
28b0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
28c0: 65 28 76 2c 20 30 2c 20 22 73 79 6e 63 68 72 6f  e(v, 0, "synchro
28d0: 6e 6f 75 73 22 2c 20 50 33 5f 53 54 41 54 49 43  nous", P3_STATIC
28e0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
28f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2900: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
2910: 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65 74 53  e(getSync), getS
2920: 79 6e 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ync);.      sqli
2930: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2940: 76 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  v, addr+2, addr+
2950: 39 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  9);.    }else{. 
2960: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
2970: 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 3b 0a  db->cache_size;.
2980: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 30        if( size<0
2990: 20 29 20 73 69 7a 65 20 3d 20 2d 73 69 7a 65 3b   ) size = -size;
29a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
29b0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
29c0: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  n(pParse, 0, 0);
29d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
29f0: 61 64 43 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b  adCookie, 0, 2);
2a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
2a20: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
2a30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2a40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
2a50: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
2a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 30  ddOp(v, OP_Ne, 0
2a80: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
2a90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2aa0: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
2ab0: 4d 41 58 5f 50 41 47 45 53 2c 20 30 29 3b 0a 20  MAX_PAGES, 0);. 
2ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ad0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 62 73 56  AddOp(v, OP_AbsV
2ae0: 61 6c 75 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  alue, 0, 0);.   
2af0: 20 20 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65     db->safety_le
2b00: 76 65 6c 20 3d 20 67 65 74 53 61 66 65 74 79 4c  vel = getSafetyL
2b10: 65 76 65 6c 28 7a 52 69 67 68 74 29 2b 31 3b 0a  evel(zRight)+1;.
2b20: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 73 61        if( db->sa
2b30: 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 31 20 29 7b  fety_level==1 ){
2b40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2b60: 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29 3b  Negative, 0, 0);
2b70: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20  .        size = 
2b80: 2d 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 20  -size;.      }. 
2b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ba0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
2bb0: 6f 6f 6b 69 65 2c 20 30 2c 20 32 29 3b 0a 20 20  ookie, 0, 2);.  
2bc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
2be0: 65 72 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c  er, db->safety_l
2bf0: 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  evel, 0);.      
2c00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
2c20: 2c 20 30 2c 20 33 29 3b 0a 20 20 20 20 20 20 73  , 0, 3);.      s
2c30: 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
2c40: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
2c50: 0a 20 20 20 20 20 20 64 62 2d 3e 63 61 63 68 65  .      db->cache
2c60: 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20  _size = size;.  
2c70: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2c80: 53 65 74 43 61 63 68 65 53 69 7a 65 28 64 62 2d  SetCacheSize(db-
2c90: 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 2d  >aDb[0].pBt, db-
2ca0: 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20  >cache_size);.  
2cb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2cc0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 64  SetSafetyLevel(d
2cd0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 64  b->aDb[0].pBt, d
2ce0: 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  b->safety_level)
2cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2d00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41  .  /*.  **   PRA
2d10: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a  GMA synchronous.
2d20: 20 20 2a 2a 20 20 20 50 52 41 47 4d 41 20 73 79    **   PRAGMA sy
2d30: 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 7c 4f 4e  nchronous=OFF|ON
2d40: 7c 4e 4f 52 4d 41 4c 7c 46 55 4c 4c 0a 20 20 2a  |NORMAL|FULL.  *
2d50: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 6f 72  *.  ** Return or
2d60: 20 73 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 76   set the local v
2d70: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 6e 63  alue of the sync
2d80: 68 72 6f 6e 6f 75 73 20 66 6c 61 67 2e 20 20 43  hronous flag.  C
2d90: 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20 74 68 65  hanging.  ** the
2da0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20 64 6f 65   local value doe
2db0: 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68 61 6e 67  s not make chang
2dc0: 65 73 20 74 6f 20 74 68 65 20 64 69 73 6b 20 66  es to the disk f
2dd0: 69 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a  ile and the.  **
2de0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77   default value w
2df0: 69 6c 6c 20 62 65 20 72 65 73 74 6f 72 65 64 20  ill be restored 
2e00: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  the next time th
2e10: 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 20 20  e database is.  
2e20: 2a 2a 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  ** opened..  */.
2e30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2e40: 49 43 6d 70 28 7a 4c 65 66 74 2c 22 73 79 6e 63  ICmp(zLeft,"sync
2e50: 68 72 6f 6e 6f 75 73 22 29 3d 3d 30 20 29 7b 0a  hronous")==0 ){.
2e60: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
2e70: 70 4c 69 73 74 20 67 65 74 53 79 6e 63 5b 5d 20  pList getSync[] 
2e80: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  = {.      { OP_C
2e90: 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31 2c 20 30  allback,    1, 0
2ea0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
2eb0: 20 7d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   };.    if( SQLI
2ec0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2ed0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2d  adSchema(pParse-
2ee0: 3e 64 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  >db) ) return;. 
2ef0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a     if( pRight->z
2f00: 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  ==pLeft->z ){.  
2f10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
2f20: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b  etNumCols(v, 1);
2f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f40: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
2f50: 30 2c 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22  0, "synchronous"
2f60: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
2f70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f80: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
2f90: 65 72 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c  er, db->safety_l
2fa0: 65 76 65 6c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  evel-1, 0);.    
2fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fc0: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
2fd0: 69 7a 65 28 67 65 74 53 79 6e 63 29 2c 20 67 65  ize(getSync), ge
2fe0: 74 53 79 6e 63 29 3b 0a 20 20 20 20 7d 65 6c 73  tSync);.    }els
2ff0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  e{.      int siz
3000: 65 20 3d 20 64 62 2d 3e 63 61 63 68 65 5f 73 69  e = db->cache_si
3010: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ze;.      if( si
3020: 7a 65 3c 30 20 29 20 73 69 7a 65 20 3d 20 2d 73  ze<0 ) size = -s
3030: 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 73  ize;.      db->s
3040: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 67 65  afety_level = ge
3050: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 7a 52 69  tSafetyLevel(zRi
3060: 67 68 74 29 2b 31 3b 0a 20 20 20 20 20 20 69 66  ght)+1;.      if
3070: 28 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76  ( db->safety_lev
3080: 65 6c 3d 3d 31 20 29 20 73 69 7a 65 20 3d 20 2d  el==1 ) size = -
3090: 73 69 7a 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  size;.      db->
30a0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a  cache_size = siz
30b0: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
30c0: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
30d0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
30e0: 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
30f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3100: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
3110: 76 65 6c 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  vel(db->aDb[0].p
3120: 42 74 2c 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c  Bt, db->safety_l
3130: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
3140: 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 4e 44  else..#ifndef ND
3150: 45 42 55 47 0a 20 20 69 66 28 20 73 71 6c 69 74  EBUG.  if( sqlit
3160: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
3170: 20 22 74 72 69 67 67 65 72 5f 6f 76 65 72 68 65   "trigger_overhe
3180: 61 64 5f 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a  ad_test")==0 ){.
3190: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
31a0: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
31b0: 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f      always_code_
31c0: 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20  trigger_setup = 
31d0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
31e0: 20 20 20 20 61 6c 77 61 79 73 5f 63 6f 64 65 5f      always_code_
31f0: 74 72 69 67 67 65 72 5f 73 65 74 75 70 20 3d 20  trigger_setup = 
3200: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
3210: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 66  .#endif..  if( f
3220: 6c 61 67 50 72 61 67 6d 61 28 70 50 61 72 73 65  lagPragma(pParse
3230: 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 29  , zLeft, zRight)
3240: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
3250: 6c 61 67 50 72 61 67 6d 61 28 29 20 63 61 6c 6c  lagPragma() call
3260: 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20   also generates 
3270: 61 6e 79 20 6e 65 63 65 73 73 61 72 79 20 63 6f  any necessary co
3280: 64 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 0a 0a 20  de */.  }else.. 
3290: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
32a0: 43 6d 70 28 7a 4c 65 66 74 2c 20 22 74 61 62 6c  Cmp(zLeft, "tabl
32b0: 65 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a 20  e_info")==0 ){. 
32c0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
32d0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
32e0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
32f0: 68 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29  hema(pParse->db)
3300: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
3310: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
3320: 64 54 61 62 6c 65 28 64 62 2c 20 7a 52 69 67 68  dTable(db, zRigh
3330: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
3340: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Tab ){.      int
3350: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
3360: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
3370: 76 2c 20 36 29 3b 0a 20 20 20 20 20 20 73 71 6c  v, 6);.      sql
3380: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
3390: 6d 65 28 76 2c 20 30 2c 20 22 63 69 64 22 2c 20  me(v, 0, "cid", 
33a0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
33b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
33c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 22 6e  ColName(v, 1, "n
33d0: 61 6d 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ame", P3_STATIC)
33e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33f0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3400: 20 32 2c 20 22 74 79 70 65 22 2c 20 50 33 5f 53   2, "type", P3_S
3410: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
3420: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
3430: 61 6d 65 28 76 2c 20 33 2c 20 22 6e 6f 74 6e 75  ame(v, 3, "notnu
3440: 6c 6c 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ll", P3_STATIC);
3450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3460: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
3470: 34 2c 20 22 64 66 6c 74 5f 76 61 6c 75 65 22 2c  4, "dflt_value",
3480: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
3490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
34a0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 35 2c 20 22  tColName(v, 5, "
34b0: 70 6b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  pk", P3_STATIC);
34c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 69  .      sqlite3Vi
34d0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
34e0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
34f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3500: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
3510: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3520: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3530: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
3540: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3550: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
3560: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54  tring8, 0, 0, pT
3570: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
3580: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
3590: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
35a0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
35b0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  0,.           pT
35c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70  ab->aCol[i].zTyp
35d0: 65 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e ? pTab->aCol[i
35e0: 5d 2e 7a 54 79 70 65 20 3a 20 22 6e 75 6d 65 72  ].zType : "numer
35f0: 69 63 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ic", 0);.       
3600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3610: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3620: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
3630: 6f 74 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  otNull, 0);.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
3650: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
3660: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
3670: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d     pTab->aCol[i]
3680: 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49  .zDflt, P3_STATI
3690: 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  C);.        sqli
36a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
36b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62  OP_Integer, pTab
36c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 73 50 72 69 6d  ->aCol[i].isPrim
36d0: 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
36e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36f0: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
3700: 2c 20 36 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 6, 0);.      }
3710: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
3720: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3730: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 69 6e 64  ICmp(zLeft, "ind
3740: 65 78 5f 69 6e 66 6f 22 29 3d 3d 30 20 29 7b 0a  ex_info")==0 ){.
3750: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
3760: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
3770: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
3780: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
3790: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2d 3e 64  Schema(pParse->d
37a0: 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  b) ) return;.   
37b0: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 46   pIdx = sqlite3F
37c0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 52 69  indIndex(db, zRi
37d0: 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ght, 0);.    if(
37e0: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
37f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 54 61 62  nt i;.      pTab
3800: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
3810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3820: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
3830: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
3840: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
3850: 76 2c 20 30 2c 20 22 73 65 71 6e 6f 22 2c 20 50  v, 0, "seqno", P
3860: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
3870: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
3880: 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 22 63 69  olName(v, 1, "ci
3890: 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  d", P3_STATIC);.
38a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38b0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32  eSetColName(v, 2
38c0: 2c 20 22 6e 61 6d 65 22 2c 20 50 33 5f 53 54 41  , "name", P3_STA
38d0: 54 49 43 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  TIC);.      for(
38e0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
38f0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3900: 20 20 20 20 69 6e 74 20 63 6e 75 6d 20 3d 20 70      int cnum = p
3910: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
3920: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3930: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3940: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
3950: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3960: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3970: 49 6e 74 65 67 65 72 2c 20 63 6e 75 6d 2c 20 30  Integer, cnum, 0
3980: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3990: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 63 6e  t( pTab->nCol>cn
39a0: 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  um );.        sq
39b0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
39c0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
39d0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 63 6e 75  , pTab->aCol[cnu
39e0: 6d 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  m].zName, 0);.  
39f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3a00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
3a10: 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
3a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
3a30: 6c 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  lse..  if( sqlit
3a40: 65 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c  e3StrICmp(zLeft,
3a50: 20 22 69 6e 64 65 78 5f 6c 69 73 74 22 29 3d 3d   "index_list")==
3a60: 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  0 ){.    Index *
3a70: 70 49 64 78 3b 0a 20 20 20 20 54 61 62 6c 65 20  pIdx;.    Table 
3a80: 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 53  *pTab;.    if( S
3a90: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
3aa0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
3ab0: 73 65 2d 3e 64 62 29 20 29 20 72 65 74 75 72 6e  se->db) ) return
3ac0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  ;.    pTab = sql
3ad0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
3ae0: 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , zRight, 0);.  
3af0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
3b00: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
3b10: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
3b20: 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 54 61        pIdx = pTa
3b30: 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d  b->pIndex;.    }
3b40: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26  .    if( pTab &&
3b50: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69   pIdx ){.      i
3b60: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
3b70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
3b80: 75 6d 43 6f 6c 73 28 76 2c 20 33 29 3b 0a 20 20  umCols(v, 3);.  
3b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3ba0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
3bb0: 22 73 65 71 22 2c 20 50 33 5f 53 54 41 54 49 43  "seq", P3_STATIC
3bc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3bd0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
3be0: 2c 20 31 2c 20 22 6e 61 6d 65 22 2c 20 50 33 5f  , 1, "name", P3_
3bf0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3c00: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
3c10: 4e 61 6d 65 28 76 2c 20 32 2c 20 22 75 6e 69 71  Name(v, 2, "uniq
3c20: 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
3c30: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 70 49 64  .      while(pId
3c40: 78 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  x){.        sqli
3c50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3c60: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
3c70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3c80: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
3c90: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
3ca0: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Idx->zName, 0);.
3cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
3cd0: 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 6f 6e  nteger, pIdx->on
3ce0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 20  Error!=OE_None, 
3cf0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3d00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3d10: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 33 2c 20  OP_Callback, 3, 
3d20: 30 29 3b 0a 20 20 20 20 20 20 20 20 2b 2b 69 3b  0);.        ++i;
3d30: 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20  .        pIdx = 
3d40: 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pIdx->pNext;.   
3d50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
3d60: 73 65 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se..  if( sqlite
3d70: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
3d80: 22 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73  "foreign_key_lis
3d90: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 4b  t")==0 ){.    FK
3da0: 65 79 20 2a 70 46 4b 3b 0a 20 20 20 20 54 61 62  ey *pFK;.    Tab
3db0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66  le *pTab;.    if
3dc0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
3dd0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
3de0: 50 61 72 73 65 2d 3e 64 62 29 20 29 20 72 65 74  Parse->db) ) ret
3df0: 75 72 6e 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  urn;.    pTab = 
3e00: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
3e10: 28 64 62 2c 20 7a 52 69 67 68 74 2c 20 30 29 3b  (db, zRight, 0);
3e20: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
3e30: 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
3e40: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
3e50: 29 3b 0a 20 20 20 20 20 20 70 46 4b 20 3d 20 70  );.      pFK = p
3e60: 54 61 62 2d 3e 70 46 4b 65 79 3b 0a 20 20 20 20  Tab->pFKey;.    
3e70: 7d 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 26  }.    if( pTab &
3e80: 26 20 70 46 4b 20 29 7b 0a 20 20 20 20 20 20 69  & pFK ){.      i
3e90: 6e 74 20 69 20 3d 20 30 3b 20 0a 20 20 20 20 20  nt i = 0; .     
3ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
3eb0: 75 6d 43 6f 6c 73 28 76 2c 20 35 29 3b 0a 20 20  umCols(v, 5);.  
3ec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3ed0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
3ee0: 22 69 64 22 2c 20 50 33 5f 53 54 41 54 49 43 29  "id", P3_STATIC)
3ef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3f00: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
3f10: 20 31 2c 20 22 73 65 71 22 2c 20 50 33 5f 53 54   1, "seq", P3_ST
3f20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
3f30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
3f40: 6d 65 28 76 2c 20 32 2c 20 22 74 61 62 6c 65 22  me(v, 2, "table"
3f50: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
3f60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
3f70: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 33 2c 20  etColName(v, 3, 
3f80: 22 66 72 6f 6d 22 2c 20 50 33 5f 53 54 41 54 49  "from", P3_STATI
3f90: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3fa0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
3fb0: 76 2c 20 34 2c 20 22 74 6f 22 2c 20 50 33 5f 53  v, 4, "to", P3_S
3fc0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 77 68  TATIC);.      wh
3fd0: 69 6c 65 28 70 46 4b 29 7b 0a 20 20 20 20 20 20  ile(pFK){.      
3fe0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
3ff0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 46 4b 2d   for(j=0; j<pFK-
4000: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
4010: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4020: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
4030: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
4040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4050: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4060: 6e 74 65 67 65 72 2c 20 6a 2c 20 30 29 3b 0a 20  nteger, j, 0);. 
4070: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4080: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
4090: 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 46 4b  ring8, 0, 0, pFK
40a0: 2d 3e 7a 54 6f 2c 20 30 29 3b 0a 20 20 20 20 20  ->zTo, 0);.     
40b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
40c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
40d0: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
4100: 46 4b 2d 3e 61 43 6f 6c 5b 6a 5d 2e 69 46 72 6f  FK->aCol[j].iFro
4110: 6d 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  m].zName, 0);.  
4120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4130: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
4140: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 46 4b 2d  ing8, 0, 0, pFK-
4150: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 2c 20 30  >aCol[j].zCol, 0
4160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4170: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4180: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 35 2c   OP_Callback, 5,
4190: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
41a0: 20 20 20 20 20 20 20 2b 2b 69 3b 0a 20 20 20 20         ++i;.    
41b0: 20 20 20 20 70 46 4b 20 3d 20 70 46 4b 2d 3e 70      pFK = pFK->p
41c0: 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 20 20  NextFrom;.      
41d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
41e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
41f0: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 64 61  rICmp(zLeft, "da
4200: 74 61 62 61 73 65 5f 6c 69 73 74 22 29 3d 3d 30  tabase_list")==0
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4220: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
4230: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
4240: 65 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 20  ema(pParse->db) 
4250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
4260: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
4270: 6f 6c 73 28 76 2c 20 33 29 3b 0a 20 20 20 20 73  ols(v, 3);.    s
4280: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
4290: 4e 61 6d 65 28 76 2c 20 30 2c 20 22 73 65 71 22  Name(v, 0, "seq"
42a0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
42b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
42c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 31 2c 20 22 6e  ColName(v, 1, "n
42d0: 61 6d 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29  ame", P3_STATIC)
42e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
42f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 32  eSetColName(v, 2
4300: 2c 20 22 66 69 6c 65 22 2c 20 50 33 5f 53 54 41  , "file", P3_STA
4310: 54 49 43 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  TIC);.    for(i=
4320: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4330: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  +){.      if( db
4340: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20  ->aDb[i].pBt==0 
4350: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4360: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
4370: 62 5b 69 5d 2e 7a 4e 61 6d 65 21 3d 30 20 29 3b  b[i].zName!=0 );
4380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4390: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
43a0: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
43b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
43c0: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
43d0: 2c 20 30 2c 20 30 2c 20 64 62 2d 3e 61 44 62 5b  , 0, 0, db->aDb[
43e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  i].zName, 0);.  
43f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
4400: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
4410: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
4420: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
4430: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
4440: 44 62 5b 69 5d 2e 70 42 74 29 2c 20 30 29 3b 0a  Db[i].pBt), 0);.
4450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4460: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
4470: 6c 62 61 63 6b 2c 20 33 2c 20 30 29 3b 0a 20 20  lback, 3, 0);.  
4480: 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20 20    }.  }else...  
4490: 2f 2a 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  /*.  **   PRAGMA
44a0: 20 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a   temp_store.  **
44b0: 20 20 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73     PRAGMA temp_s
44c0: 74 6f 72 65 20 3d 20 22 64 65 66 61 75 6c 74 22  tore = "default"
44d0: 7c 22 6d 65 6d 6f 72 79 22 7c 22 66 69 6c 65 22  |"memory"|"file"
44e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72  .  **.  ** Retur
44f0: 6e 20 6f 72 20 73 65 74 20 74 68 65 20 6c 6f 63  n or set the loc
4500: 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  al value of the 
4510: 74 65 6d 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e  temp_store flag.
4520: 20 20 43 68 61 6e 67 69 6e 67 0a 20 20 2a 2a 20    Changing.  ** 
4530: 74 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 20  the local value 
4540: 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 63 68  does not make ch
4550: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 69 73  anges to the dis
4560: 6b 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  k file and the d
4570: 65 66 61 75 6c 74 0a 20 20 2a 2a 20 76 61 6c 75  efault.  ** valu
4580: 65 20 77 69 6c 6c 20 62 65 20 72 65 73 74 6f 72  e will be restor
4590: 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
45a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
45b0: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20   opened..  **.  
45c0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 74 20  ** Note that it 
45d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
45e0: 74 68 65 20 6c 69 62 72 61 72 79 20 63 6f 6d 70  the library comp
45f0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
4600: 20 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 72 69 64   to.  ** overrid
4610: 65 20 74 68 69 73 20 73 65 74 74 69 6e 67 0a 20  e this setting. 
4620: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
4630: 33 53 74 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20  3StrICmp(zLeft, 
4640: 22 74 65 6d 70 5f 73 74 6f 72 65 22 29 3d 3d 30  "temp_store")==0
4650: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56   ){.    static V
4660: 64 62 65 4f 70 4c 69 73 74 20 67 65 74 54 6d 70  dbeOpList getTmp
4670: 44 62 4c 6f 63 5b 5d 20 3d 20 7b 0a 20 20 20 20  DbLoc[] = {.    
4680: 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
4690: 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
46a0: 20 30 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0},.    };.    
46b0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
46c0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
46d0: 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29 20 72  (pParse->db) ) r
46e0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
46f0: 52 69 67 68 74 2d 3e 7a 3d 3d 70 4c 65 66 74 2d  Right->z==pLeft-
4700: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
4710: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4720: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
4730: 74 65 6d 70 5f 73 74 6f 72 65 2c 20 30 29 3b 0a  temp_store, 0);.
4740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4750: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
4760: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4770: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
4780: 2c 20 30 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65  , 0, "temp_store
4790: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47b0: 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
47c0: 61 79 53 69 7a 65 28 67 65 74 54 6d 70 44 62 4c  aySize(getTmpDbL
47d0: 6f 63 29 2c 20 67 65 74 54 6d 70 44 62 4c 6f 63  oc), getTmpDbLoc
47e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
47f0: 20 20 20 20 63 68 61 6e 67 65 54 65 6d 70 53 74      changeTempSt
4800: 6f 72 61 67 65 28 70 50 61 72 73 65 2c 20 7a 52  orage(pParse, zR
4810: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ight);.    }.  }
4820: 65 6c 73 65 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  else..  /*.  ** 
4830: 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74    PRAGMA default
4840: 5f 74 65 6d 70 5f 73 74 6f 72 65 0a 20 20 2a 2a  _temp_store.  **
4850: 20 20 20 50 52 41 47 4d 41 20 64 65 66 61 75 6c     PRAGMA defaul
4860: 74 5f 74 65 6d 70 5f 73 74 6f 72 65 20 3d 20 22  t_temp_store = "
4870: 64 65 66 61 75 6c 74 22 7c 22 6d 65 6d 6f 72 79  default"|"memory
4880: 22 7c 22 66 69 6c 65 22 0a 20 20 2a 2a 0a 20 20  "|"file".  **.  
4890: 2a 2a 20 52 65 74 75 72 6e 20 6f 72 20 73 65 74  ** Return or set
48a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
48b0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 74 65 6d  e persistent tem
48c0: 70 5f 73 74 6f 72 65 20 66 6c 61 67 2e 20 20 41  p_store flag.  A
48d0: 6e 79 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 64  ny.  ** change d
48e0: 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 65 66 66  oes not take eff
48f0: 65 63 74 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  ect until the ne
4900: 78 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  xt time the data
4910: 62 61 73 65 20 69 73 0a 20 20 2a 2a 20 6f 70 65  base is.  ** ope
4920: 6e 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  ned..  **.  ** N
4930: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 70  ote that it is p
4940: 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
4950: 6c 69 62 72 61 72 79 20 63 6f 6d 70 69 6c 65 2d  library compile-
4960: 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 6f 0a  time options to.
4970: 20 20 2a 2a 20 6f 76 65 72 72 69 64 65 20 74 68    ** override th
4980: 69 73 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  is setting.  */.
4990: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
49a0: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 64 65 66  ICmp(zLeft, "def
49b0: 61 75 6c 74 5f 74 65 6d 70 5f 73 74 6f 72 65 22  ault_temp_store"
49c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
49d0: 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 67 65  ic VdbeOpList ge
49e0: 74 54 6d 70 44 62 4c 6f 63 5b 5d 20 3d 20 7b 0a  tTmpDbLoc[] = {.
49f0: 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 61 64 43        { OP_ReadC
4a00: 6f 6f 6b 69 65 2c 20 20 30 2c 20 35 2c 20 20 20  ookie,  0, 5,   
4a10: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
4a20: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20   OP_Callback,   
4a30: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
4a40: 7d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  };.    if( SQLIT
4a50: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
4a60: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2d 3e  dSchema(pParse->
4a70: 64 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  db) ) return;.  
4a80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 7a 3d    if( pRight->z=
4a90: 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20  =pLeft->z ){.   
4aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
4ab0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
4ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ad0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30  eSetColName(v, 0
4ae0: 2c 20 22 74 65 6d 70 5f 73 74 6f 72 65 22 2c 20  , "temp_store", 
4af0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4b10: 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53  OpList(v, ArrayS
4b20: 69 7a 65 28 67 65 74 54 6d 70 44 62 4c 6f 63 29  ize(getTmpDbLoc)
4b30: 2c 20 67 65 74 54 6d 70 44 62 4c 6f 63 29 3b 0a  , getTmpDbLoc);.
4b40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b50: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
4b60: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
4b70: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
4b80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
4ba0: 20 67 65 74 54 65 6d 70 53 74 6f 72 65 28 7a 52   getTempStore(zR
4bb0: 69 67 68 74 29 2c 20 30 29 3b 0a 20 20 20 20 20  ight), 0);.     
4bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bd0: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
4be0: 65 2c 20 30 2c 20 35 29 3b 0a 20 20 20 20 20 20  e, 0, 5);.      
4bf0: 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
4c00: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29  peration(pParse)
4c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
4c20: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
4c30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4c40: 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 70 61 72  ICmp(zLeft, "par
4c50: 73 65 72 5f 74 72 61 63 65 22 29 3d 3d 30 20 29  ser_trace")==0 )
4c60: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
4c70: 64 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 54  d sqlite3ParserT
4c80: 72 61 63 65 28 46 49 4c 45 2a 2c 20 63 68 61 72  race(FILE*, char
4c90: 20 2a 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   *);.    if( SQL
4ca0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
4cb0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
4cc0: 2d 3e 64 62 29 20 29 20 72 65 74 75 72 6e 3b 0a  ->db) ) return;.
4cd0: 20 20 20 20 69 66 28 20 67 65 74 42 6f 6f 6c 65      if( getBoole
4ce0: 61 6e 28 7a 52 69 67 68 74 29 20 29 7b 0a 20 20  an(zRight) ){.  
4cf0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 72 73 65      sqlite3Parse
4d00: 72 54 72 61 63 65 28 73 74 64 6f 75 74 2c 20 22  rTrace(stdout, "
4d10: 70 61 72 73 65 72 3a 20 22 29 3b 0a 20 20 20 20  parser: ");.    
4d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4d30: 69 74 65 33 50 61 72 73 65 72 54 72 61 63 65 28  ite3ParserTrace(
4d40: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
4d50: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
4d60: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
4d70: 70 28 7a 4c 65 66 74 2c 20 22 69 6e 74 65 67 72  p(zLeft, "integr
4d80: 69 74 79 5f 63 68 65 63 6b 22 29 3d 3d 30 20 29  ity_check")==0 )
4d90: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c 20  {.    int i, j, 
4da0: 61 64 64 72 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  addr;..    /* Co
4db0: 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  de that initiali
4dc0: 7a 65 73 20 74 68 65 20 69 6e 74 65 67 72 69 74  zes the integrit
4dd0: 79 20 63 68 65 63 6b 20 70 72 6f 67 72 61 6d 2e  y check program.
4de0: 20 20 53 65 74 20 74 68 65 0a 20 20 20 20 2a 2a    Set the.    **
4df0: 20 65 72 72 6f 72 20 63 6f 75 6e 74 20 30 0a 20   error count 0. 
4e00: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
4e10: 20 56 64 62 65 4f 70 4c 69 73 74 20 69 6e 69 74   VdbeOpList init
4e20: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
4e30: 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 20   { OP_Integer,  
4e40: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
4e50: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
4e60: 65 6d 53 74 6f 72 65 2c 20 20 20 20 30 2c 20 31  emStore,    0, 1
4e70: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
4e80: 20 7d 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65   };..    /* Code
4e90: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
4ea0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4eb0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 2e  integrity check.
4ec0: 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 0a 20 20    If no error.  
4ed0: 20 20 2a 2a 20 6d 65 73 73 61 67 65 73 20 68 61    ** messages ha
4ee0: 76 65 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65  ve been generate
4ef0: 64 2c 20 6f 75 74 70 75 74 20 4f 4b 2e 20 20 4f  d, output OK.  O
4f00: 74 68 65 72 77 69 73 65 20 6f 75 74 70 75 74 20  therwise output 
4f10: 74 68 65 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  the.    ** error
4f20: 20 6d 65 73 73 61 67 65 0a 20 20 20 20 2a 2f 0a   message.    */.
4f30: 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
4f40: 70 4c 69 73 74 20 65 6e 64 43 6f 64 65 5b 5d 20  pList endCode[] 
4f50: 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  = {.      { OP_M
4f60: 65 6d 4c 6f 61 64 2c 20 20 20 20 20 30 2c 20 30  emLoad,     0, 0
4f70: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
4f80: 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72 2c     { OP_Integer,
4f90: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
4fa0: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
4fb0: 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 20 30 2c  _Ne,          0,
4fc0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 20   0,        0},  
4fd0: 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20    /* 2 */.      
4fe0: 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20  { OP_String8,   
4ff0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
5000: 22 6f 6b 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  "ok"},.      { O
5010: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20 31  P_Callback,    1
5020: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  , 0,        0},.
5030: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 2f 2a 20 49      };..    /* I
5040: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 56 44  nitialize the VD
5050: 42 45 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  BE program */.  
5060: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5070: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
5080: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29  ma(pParse->db) )
5090: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
50a0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
50b0: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71  ls(v, 1);.    sq
50c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
50d0: 61 6d 65 28 76 2c 20 30 2c 20 22 69 6e 74 65 67  ame(v, 0, "integ
50e0: 72 69 74 79 5f 63 68 65 63 6b 22 2c 20 50 33 5f  rity_check", P3_
50f0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
5100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5110: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 69  t(v, ArraySize(i
5120: 6e 69 74 43 6f 64 65 29 2c 20 69 6e 69 74 43 6f  nitCode), initCo
5130: 64 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  de);..    /* Do 
5140: 61 6e 20 69 6e 74 65 67 72 69 74 79 20 63 68 65  an integrity che
5150: 63 6b 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62  ck on each datab
5160: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
5170: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
5180: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
5190: 48 61 73 68 45 6c 65 6d 20 2a 78 3b 0a 20 20 20  HashElem *x;.   
51a0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
51b0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 61 6e 20  .      /* Do an 
51c0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20  integrity check 
51d0: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 0a 20 20  of the B-Tree.  
51e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
51f0: 28 78 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (x=sqliteHashFir
5200: 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74  st(&db->aDb[i].t
5210: 62 6c 48 61 73 68 29 3b 20 78 3b 20 78 3d 73 71  blHash); x; x=sq
5220: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 78 29 29  liteHashNext(x))
5230: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
5240: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
5250: 73 68 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20  shData(x);.     
5260: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
5270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5280: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
5290: 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 74 6e  nteger, pTab->tn
52a0: 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  um, 0);.        
52b0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  cnt++;.        f
52c0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
52d0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
52e0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
52f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5300: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5310: 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 74  Integer, pIdx->t
5320: 6e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  num, 0);.       
5330: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
5340: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5360: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 72 69  Op(v, OP_Integri
5370: 74 79 43 6b 2c 20 63 6e 74 2c 20 69 29 3b 0a 20  tyCk, cnt, i);. 
5380: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5390: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
53a0: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64   0, 1);.      ad
53b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
53d0: 38 2c 20 30 2c 20 30 2c 20 22 6f 6b 22 2c 20 50  8, 0, 0, "ok", P
53e0: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
53f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5400: 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20 61  p(v, OP_Eq, 0, a
5410: 64 64 72 2b 36 29 3b 0a 20 20 20 20 20 20 73 71  ddr+6);.      sq
5420: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5430: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
5440: 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
5450: 65 33 4d 50 72 69 6e 74 66 28 22 2a 2a 2a 20 69  e3MPrintf("*** i
5460: 6e 20 64 61 74 61 62 61 73 65 20 25 73 20 2a 2a  n database %s **
5470: 2a 5c 6e 22 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  *\n", db->aDb[i]
5480: 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
5490: 20 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P3_DYNAMIC);. 
54a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
54b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
54c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
54d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
54e0: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
54f0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
5500: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5510: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c 20 30  P_Callback, 1, 0
5520: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  );..      /* Mak
5530: 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 69  e sure all the i
5540: 6e 64 69 63 65 73 20 61 72 65 20 63 6f 6e 73 74  ndices are const
5550: 72 75 63 74 65 64 20 63 6f 72 72 65 63 74 6c 79  ructed correctly
5560: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5570: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
5580: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
5590: 20 69 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 78   i);.      for(x
55a0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
55b0: 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c  (&db->aDb[i].tbl
55c0: 48 61 73 68 29 3b 20 78 3b 20 78 3d 73 71 6c 69  Hash); x; x=sqli
55d0: 74 65 48 61 73 68 4e 65 78 74 28 78 29 29 7b 0a  teHashNext(x)){.
55e0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
55f0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
5600: 44 61 74 61 28 78 29 3b 0a 20 20 20 20 20 20 20  Data(x);.       
5610: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
5620: 20 20 20 20 20 20 69 6e 74 20 6c 6f 6f 70 54 6f        int loopTo
5630: 70 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  p;..        if( 
5640: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 20  pTab->pIndex==0 
5650: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5670: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
5680: 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20  er, i, 0);.     
5690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
56a0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  dOp(v, OP_OpenRe
56b0: 61 64 2c 20 31 2c 20 70 54 61 62 2d 3e 74 6e 75  ad, 1, pTab->tnu
56c0: 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
56d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
56e0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
56f0: 2c 20 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  , 1, pTab->nCol)
5700: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
5710: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
5720: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
5730: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6a 2b  =pIdx->pNext, j+
5740: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
5750: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 30 20  ( pIdx->tnum==0 
5760: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5780: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5790: 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
57a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
57b0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
57c0: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 6a 2b   OP_OpenRead, j+
57d0: 32 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a  2, pIdx->tnum, .
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
5800: 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20  &pIdx->keyInfo, 
5810: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
5820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
5830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5840: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
5850: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
5860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5870: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 31  , OP_MemStore, 1
5880: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f  , 1);.        lo
5890: 6f 70 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  opTop = sqlite3V
58a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
58b0: 65 77 69 6e 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ewind, 1, 0);.  
58c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
58d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
58e0: 49 6e 63 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Incr, 1, 0);.   
58f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
5900: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
5910: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
5920: 2d 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20  ->pNext, j++){. 
5930: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6d 70           int jmp
5940: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  2;.          sta
5950: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 69  tic VdbeOpList i
5960: 64 78 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20  dxErr[] = {.    
5970: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d          { OP_Mem
5980: 49 6e 63 72 2c 20 20 20 20 20 30 2c 20 20 30 2c  Incr,     0,  0,
5990: 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20 20    0},.          
59a0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
59b0: 20 20 20 20 20 30 2c 20 20 30 2c 20 20 22 72 6f       0,  0,  "ro
59c0: 77 69 64 20 22 7d 2c 0a 20 20 20 20 20 20 20 20  wid "},.        
59d0: 20 20 20 20 7b 20 4f 50 5f 52 65 63 6e 6f 2c 20      { OP_Recno, 
59e0: 20 20 20 20 20 20 31 2c 20 20 30 2c 20 20 30 7d        1,  0,  0}
59f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
5a00: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
5a10: 20 30 2c 20 20 30 2c 20 20 22 20 6d 69 73 73 69   0,  0,  " missi
5a20: 6e 67 20 66 72 6f 6d 20 69 6e 64 65 78 20 22 7d  ng from index "}
5a30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
5a40: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20  OP_String8,     
5a50: 20 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 20 20   0,  0,  0},    
5a60: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  /* 4 */.        
5a70: 20 20 20 20 7b 20 4f 50 5f 43 6f 6e 63 61 74 2c      { OP_Concat,
5a80: 20 20 20 20 20 20 34 2c 20 20 30 2c 20 20 30 7d        4,  0,  0}
5a90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
5aa0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 20  OP_Callback,    
5ab0: 31 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20  1,  0,  0},.    
5ac0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20        };.       
5ad0: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
5ae0: 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49  teIndexKey(v, pI
5af0: 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  dx, 1);.        
5b00: 20 20 6a 6d 70 32 20 3d 20 73 71 6c 69 74 65 33    jmp2 = sqlite3
5b10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5b20: 46 6f 75 6e 64 2c 20 6a 2b 32 2c 20 30 29 3b 0a  Found, j+2, 0);.
5b30: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
5b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b50: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
5b60: 7a 65 28 69 64 78 45 72 72 29 2c 20 69 64 78 45  ze(idxErr), idxE
5b70: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  rr);.          s
5b80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5b90: 50 33 28 76 2c 20 61 64 64 72 2b 34 2c 20 70 49  P3(v, addr+4, pI
5ba0: 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53 54  dx->zName, P3_ST
5bb0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
5bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5bd0: 67 65 50 32 28 76 2c 20 6a 6d 70 32 2c 20 73 71  geP2(v, jmp2, sq
5be0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5bf0: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20  Addr(v));.      
5c00: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
5c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5c20: 4f 50 5f 4e 65 78 74 2c 20 31 2c 20 6c 6f 6f 70  OP_Next, 1, loop
5c30: 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
5c40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5c50: 65 50 32 28 76 2c 20 6c 6f 6f 70 54 6f 70 2c 20  eP2(v, loopTop, 
5c60: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5c70: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
5c80: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 64      for(j=0, pId
5c90: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
5ca0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
5cb0: 3e 70 4e 65 78 74 2c 20 6a 2b 2b 29 7b 0a 20 20  >pNext, j++){.  
5cc0: 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 56          static V
5cd0: 64 62 65 4f 70 4c 69 73 74 20 63 6e 74 49 64 78  dbeOpList cntIdx
5ce0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
5cf0: 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67 65 72      { OP_Integer
5d00: 2c 20 20 20 20 20 20 30 2c 20 20 30 2c 20 20 30  ,      0,  0,  0
5d10: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  },.             
5d20: 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20  { OP_MemStore,  
5d30: 20 20 20 32 2c 20 20 31 2c 20 20 30 7d 2c 0a 20     2,  1,  0},. 
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50              { OP
5d50: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 30  _Rewind,       0
5d60: 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20 32  ,  0,  0},  /* 2
5d70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5d80: 20 7b 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 20   { OP_MemIncr,  
5d90: 20 20 20 20 32 2c 20 20 30 2c 20 20 30 7d 2c 0a      2,  0,  0},.
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f               { O
5db0: 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  P_Next,         
5dc0: 30 2c 20 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20  0,  0,  0},  /* 
5dd0: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  4 */.           
5de0: 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
5df0: 20 20 20 20 20 31 2c 20 20 30 2c 20 20 30 7d 2c       1,  0,  0},
5e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  .             { 
5e10: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 20  OP_MemLoad,     
5e20: 20 32 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20 20   2,  0,  0},.   
5e30: 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 45            { OP_E
5e40: 71 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  q,           0, 
5e50: 20 30 2c 20 20 30 7d 2c 20 20 2f 2a 20 37 20 2a   0,  0},  /* 7 *
5e60: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  /.             {
5e70: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 20 20 20   OP_MemIncr,    
5e80: 20 20 30 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20    0,  0,  0},.  
5e90: 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50 5f             { OP_
5ea0: 53 74 72 69 6e 67 38 2c 20 20 20 20 20 20 20 30  String8,       0
5eb0: 2c 20 20 30 2c 20 20 22 77 72 6f 6e 67 20 23 20  ,  0,  "wrong # 
5ec0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 69 6e  of entries in in
5ed0: 64 65 78 20 22 7d 2c 0a 20 20 20 20 20 20 20 20  dex "},.        
5ee0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
5ef0: 38 2c 20 20 20 20 20 20 20 30 2c 20 20 30 2c 20  8,       0,  0, 
5f00: 20 30 7d 2c 20 20 2f 2a 20 31 30 20 2a 2f 0a 20   0},  /* 10 */. 
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 4f 50              { OP
5f20: 5f 43 6f 6e 63 61 74 2c 20 20 20 20 20 20 20 32  _Concat,       2
5f30: 2c 20 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 20  ,  0,  0},.     
5f40: 20 20 20 20 20 20 20 20 7b 20 4f 50 5f 43 61 6c          { OP_Cal
5f50: 6c 62 61 63 6b 2c 20 20 20 20 20 31 2c 20 20 30  lback,     1,  0
5f60: 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 20 20 20  ,  0},.         
5f70: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   };.          if
5f80: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 30 20  ( pIdx->tnum==0 
5f90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5fa0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
5fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
5fc0: 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 63  t(v, ArraySize(c
5fd0: 6e 74 49 64 78 29 2c 20 63 6e 74 49 64 78 29 3b  ntIdx), cntIdx);
5fe0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5ff0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76  e3VdbeChangeP1(v
6000: 2c 20 61 64 64 72 2b 32 2c 20 6a 2b 32 29 3b 0a  , addr+2, j+2);.
6010: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6020: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
6030: 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 35 29   addr+2, addr+5)
6040: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6050: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
6060: 76 2c 20 61 64 64 72 2b 34 2c 20 6a 2b 32 29 3b  v, addr+4, j+2);
6070: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6080: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
6090: 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 33  , addr+4, addr+3
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
60b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
60c0: 28 76 2c 20 61 64 64 72 2b 37 2c 20 61 64 64 72  (v, addr+7, addr
60d0: 2b 41 72 72 61 79 53 69 7a 65 28 63 6e 74 49 64  +ArraySize(cntId
60e0: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  x));.          s
60f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6100: 50 33 28 76 2c 20 61 64 64 72 2b 31 30 2c 20 70  P3(v, addr+10, p
6110: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
6120: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
6130: 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  }.      } .    }
6140: 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
6150: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6160: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 65 6e  (v, ArraySize(en
6170: 64 43 6f 64 65 29 2c 20 65 6e 64 43 6f 64 65 29  dCode), endCode)
6180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6190: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
61a0: 72 2b 32 2c 20 61 64 64 72 2b 41 72 72 61 79 53  r+2, addr+ArrayS
61b0: 69 7a 65 28 65 6e 64 43 6f 64 65 29 29 3b 0a 20  ize(endCode));. 
61c0: 20 7d 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a   }else.  /*.  **
61d0: 20 20 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69     PRAGMA encodi
61e0: 6e 67 0a 20 20 2a 2a 20 20 20 50 52 41 47 4d 41  ng.  **   PRAGMA
61f0: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66   encoding = "utf
6200: 2d 38 22 7c 22 75 74 66 2d 31 36 22 7c 22 75 74  -8"|"utf-16"|"ut
6210: 66 2d 31 36 6c 65 22 7c 22 75 74 66 2d 31 36 62  f-16le"|"utf-16b
6220: 65 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e".  **.  ** In 
6230: 69 74 27 73 20 66 69 72 73 74 20 66 6f 72 6d 2c  it's first form,
6240: 20 74 68 69 73 20 70 72 61 67 6d 61 20 72 65 74   this pragma ret
6250: 75 72 6e 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  urns the encodin
6260: 67 20 6f 66 20 74 68 65 20 6d 61 69 6e 0a 20 20  g of the main.  
6270: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  ** database. If 
6280: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
6290: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  not initialized,
62a0: 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
62b0: 65 64 20 6e 6f 77 2e 0a 20 20 2a 2a 0a 20 20 2a  ed now..  **.  *
62c0: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
62d0: 6d 20 6f 66 20 74 68 69 73 20 70 72 61 67 6d 61  m of this pragma
62e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
62f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6300: 20 66 69 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6e   file.  ** has n
6310: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
6320: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 49 6e 20  initialized. In 
6330: 74 68 69 73 20 63 61 73 65 20 69 74 20 73 65 74  this case it set
6340: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20  s the default.  
6350: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74  ** encoding that
6360: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
6370: 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
6380: 61 73 65 20 66 69 6c 65 20 69 66 20 61 20 6e 65  ase file if a ne
6390: 77 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 63  w file.  ** is c
63a0: 72 65 61 74 65 64 2e 20 49 66 20 61 6e 20 65 78  reated. If an ex
63b0: 69 73 74 69 6e 67 20 6d 61 69 6e 20 64 61 74 61  isting main data
63c0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
63d0: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ned, then the.  
63e0: 2a 2a 20 64 65 66 61 75 6c 74 20 74 65 78 74 20  ** default text 
63f0: 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65  encoding for the
6400: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
6410: 73 65 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2a  se is used..  **
6420: 20 0a 20 20 2a 2a 20 49 6e 20 61 6c 6c 20 63 61   .  ** In all ca
6430: 73 65 73 20 6e 65 77 20 64 61 74 61 62 61 73 65  ses new database
6440: 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  s created using 
6450: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
6460: 6e 64 20 61 72 65 0a 20 20 2a 2a 20 63 72 65 61  nd are.  ** crea
6470: 74 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 73  ted to use the s
6480: 61 6d 65 20 64 65 66 61 75 6c 74 20 74 65 78 74  ame default text
6490: 20 65 6e 63 6f 64 69 6e 67 20 61 73 20 74 68 65   encoding as the
64a0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
64b0: 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 61 69 6e  If.  ** the main
64c0: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
64d0: 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  t been initializ
64e0: 65 64 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65  ed and/or create
64f0: 64 20 77 68 65 6e 20 41 54 54 41 43 48 0a 20 20  d when ATTACH.  
6500: 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 2c 20  ** is executed, 
6510: 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  this is done bef
6520: 6f 72 65 20 74 68 65 20 41 54 54 41 43 48 20 6f  ore the ATTACH o
6530: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20  peration..  **. 
6540: 20 2a 2a 20 49 6e 20 74 68 65 20 73 65 63 6f 6e   ** In the secon
6550: 64 20 66 6f 72 6d 20 74 68 69 73 20 70 72 61 67  d form this prag
6560: 6d 61 20 73 65 74 73 20 74 68 65 20 74 65 78 74  ma sets the text
6570: 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 62 65 20   encoding to be 
6580: 75 73 65 64 20 69 6e 0a 20 20 2a 2a 20 6e 65 77  used in.  ** new
6590: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
65a0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
65b0: 69 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  is database hand
65c0: 6c 65 2e 20 49 74 20 69 73 20 6f 6e 6c 79 0a 20  le. It is only. 
65d0: 20 2a 2a 20 75 73 65 66 75 6c 20 69 66 20 69 6e   ** useful if in
65e0: 76 6f 6b 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  voked immediatel
65f0: 79 20 61 66 74 65 72 20 74 68 65 20 6d 61 69 6e  y after the main
6600: 20 64 61 74 61 62 61 73 65 20 69 0a 20 20 2a 2f   database i.  */
6610: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6620: 72 49 43 6d 70 28 7a 4c 65 66 74 2c 20 22 65 6e  rICmp(zLeft, "en
6630: 63 6f 64 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  coding")==0 ){. 
6640: 20 20 20 73 74 72 75 63 74 20 45 6e 63 4e 61 6d     struct EncNam
6650: 65 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e {.      char *
6660: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 75 38 20  zName;.      u8 
6670: 65 6e 63 3b 0a 20 20 20 20 7d 20 65 6e 63 6e 61  enc;.    } encna
6680: 6d 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  mes[] = {.      
6690: 7b 20 22 55 54 46 2d 38 22 2c 20 54 45 58 54 5f  { "UTF-8", TEXT_
66a0: 55 74 66 38 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Utf8 },.      { 
66b0: 22 55 54 46 2d 31 36 6c 65 22 2c 20 54 45 58 54  "UTF-16le", TEXT
66c0: 5f 55 74 66 31 36 6c 65 20 7d 2c 0a 20 20 20 20  _Utf16le },.    
66d0: 20 20 7b 20 22 55 54 46 2d 31 36 62 65 22 2c 20    { "UTF-16be", 
66e0: 54 45 58 54 5f 55 74 66 31 36 62 65 20 7d 2c 0a  TEXT_Utf16be },.
66f0: 20 20 20 20 20 20 7b 20 22 55 54 46 2d 31 36 22        { "UTF-16"
6700: 2c 20 54 45 58 54 5f 55 74 66 31 36 20 7d 2c 0a  , TEXT_Utf16 },.
6710: 20 20 20 20 20 20 7b 20 22 55 54 46 38 22 2c 20        { "UTF8", 
6720: 54 45 58 54 5f 55 74 66 38 20 7d 2c 0a 20 20 20  TEXT_Utf8 },.   
6730: 20 20 20 7b 20 22 55 54 46 31 36 6c 65 22 2c 20     { "UTF16le", 
6740: 54 45 58 54 5f 55 74 66 31 36 6c 65 20 7d 2c 0a  TEXT_Utf16le },.
6750: 20 20 20 20 20 20 7b 20 22 55 54 46 31 36 62 65        { "UTF16be
6760: 22 2c 20 54 45 58 54 5f 55 74 66 31 36 62 65 20  ", TEXT_Utf16be 
6770: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 55 54 46 31  },.      { "UTF1
6780: 36 22 2c 20 54 45 58 54 5f 55 74 66 31 36 20 7d  6", TEXT_Utf16 }
6790: 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d  ,.      { 0, 0 }
67a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 73 74 72 75  .    };.    stru
67b0: 63 74 20 45 6e 63 4e 61 6d 65 20 2a 70 45 6e 63  ct EncName *pEnc
67c0: 3b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  ;.    if( pRight
67d0: 2d 3e 7a 3d 3d 70 4c 65 66 74 2d 3e 7a 20 29 7b  ->z==pLeft->z ){
67e0: 20 20 20 20 2f 2a 20 22 50 52 41 47 4d 41 20 65      /* "PRAGMA e
67f0: 6e 63 6f 64 69 6e 67 22 20 2a 2f 0a 20 20 20 20  ncoding" */.    
6800: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6810: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
6820: 6d 61 28 70 50 61 72 73 65 2d 3e 64 62 29 20 29  ma(pParse->db) )
6830: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73   return;.      s
6840: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6850: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
6860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6870: 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 65  ColName(v, 0, "e
6880: 6e 63 6f 64 69 6e 67 22 2c 20 50 33 5f 53 54 41  ncoding", P3_STA
6890: 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TIC);.      sqli
68a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
68b0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
68c0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e  );.      for(pEn
68d0: 63 3d 26 65 6e 63 6e 61 6d 65 73 5b 30 5d 3b 20  c=&encnames[0]; 
68e0: 70 45 6e 63 2d 3e 7a 4e 61 6d 65 3b 20 70 45 6e  pEnc->zName; pEn
68f0: 63 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  c++){.        if
6900: 28 20 70 45 6e 63 2d 3e 65 6e 63 3d 3d 70 50 61  ( pEnc->enc==pPa
6910: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 20 29 7b 0a  rse->db->enc ){.
6920: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6930: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
6940: 20 2d 31 2c 20 70 45 6e 63 2d 3e 7a 4e 61 6d 65   -1, pEnc->zName
6950: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6960: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6990: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
69a0: 6c 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20  llback, 1, 0);. 
69b0: 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 2f 2a 20 22 50 52 41 47 4d 41 20 65 6e 63 6f   /* "PRAGMA enco
69e0: 64 69 6e 67 20 3d 20 58 58 58 22 20 2a 2f 0a 20  ding = XXX" */. 
69f0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 68 61       /* Only cha
6a00: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
6a10: 20 73 71 6c 69 74 65 2e 65 6e 63 20 69 66 20 74   sqlite.enc if t
6a20: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
6a30: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  le is not.      
6a40: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  ** initialized. 
6a50: 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
6a60: 62 61 73 65 20 65 78 69 73 74 73 2c 20 74 68 65  base exists, the
6a70: 20 6e 65 77 20 73 71 6c 69 74 65 2e 65 6e 63 20   new sqlite.enc 
6a80: 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 77  value.      ** w
6a90: 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
6aa0: 65 6e 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  en when the sche
6ab0: 6d 61 20 69 73 20 6e 65 78 74 20 6c 6f 61 64 65  ma is next loade
6ac0: 64 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  d. If it does no
6ad0: 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  t.      ** alrea
6ae0: 64 79 20 65 78 69 73 74 73 2c 20 69 74 20 77 69  dy exists, it wi
6af0: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
6b00: 20 75 73 65 20 74 68 65 20 6e 65 77 20 65 6e 63   use the new enc
6b10: 6f 64 69 6e 67 20 76 61 6c 75 65 2e 0a 20 20 20  oding value..   
6b20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
6b30: 21 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  !(pParse->db->fl
6b40: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 69 74 69  ags&SQLITE_Initi
6b50: 61 6c 69 7a 65 64 29 20 29 7b 0a 20 20 20 20 20  alized) ){.     
6b60: 20 20 20 66 6f 72 28 70 45 6e 63 3d 26 65 6e 63     for(pEnc=&enc
6b70: 6e 61 6d 65 73 5b 30 5d 3b 20 70 45 6e 63 2d 3e  names[0]; pEnc->
6b80: 7a 4e 61 6d 65 3b 20 70 45 6e 63 2b 2b 29 7b 0a  zName; pEnc++){.
6b90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
6ba0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
6bb0: 7a 52 69 67 68 74 2c 20 70 45 6e 63 2d 3e 7a 4e  zRight, pEnc->zN
6bc0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
6bd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
6be0: 65 6e 63 20 3d 20 70 45 6e 63 2d 3e 65 6e 63 3b  enc = pEnc->enc;
6bf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6c00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
6c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c20: 20 20 69 66 28 20 21 70 45 6e 63 2d 3e 7a 4e 61    if( !pEnc->zNa
6c30: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
6c40: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 50 61  sqlite3Error(pPa
6c50: 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
6c60: 45 52 52 4f 52 2c 20 0a 20 20 20 20 20 20 20 20  ERROR, .        
6c70: 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72 74        "Unsupport
6c80: 65 64 20 65 6e 63 6f 64 69 6e 67 3a 20 25 73 22  ed encoding: %s"
6c90: 2c 20 7a 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , zRight);.     
6ca0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6cb0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 7b 7d   }.  }else..  {}
6cc0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c  .  sqliteFree(zL
6cd0: 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  eft);.  sqliteFr
6ce0: 65 65 28 7a 52 69 67 68 74 29 3b 0a 7d 0a        ee(zRight);.}.