System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b517520267722bc73cb10d5ab9fc55f41b8197e4:


0000: 23 70 72 61 67 6d 61 20 75 6e 6d 61 6e 61 67 65  #pragma unmanage
0010: 64 0a 65 78 74 65 72 6e 20 22 43 22 0a 7b 0a 0a  d.extern "C".{..
0020: 2f 2a 0a 2a 2a 20 32 30 30 35 20 46 65 62 72 75  /*.** 2005 Febru
0030: 61 72 79 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 15.**.** The
0040: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0050: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0060: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0070: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0080: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0090: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
00a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
00b0: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00c0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00d0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00e0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00f0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
0100: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
0110: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0120: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0130: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0140: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0190: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
01a0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63 6f  le contains C co
01b0: 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  de routines that
01c0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
01d0: 65 20 56 44 42 45 20 63 6f 64 65 0a 2a 2a 20 74  e VDBE code.** t
01e0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
01f0: 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 63  he ALTER TABLE c
0200: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 24 49  ommand..**.** $I
0210: 64 3a 20 61 6c 74 65 72 2e 63 2c 76 20 31 2e 36  d: alter.c,v 1.6
0220: 20 32 30 30 35 2f 30 38 2f 30 31 20 31 39 3a 33   2005/08/01 19:3
0230: 32 3a 30 38 20 72 6d 73 69 6d 70 73 6f 6e 20 45  2:08 rmsimpson E
0240: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
0250: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0260: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0270: 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >../*.** The cod
0280: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 6f  e in this file o
0290: 6e 6c 79 20 65 78 69 73 74 73 20 69 66 20 77 65  nly exists if we
02a0: 20 61 72 65 20 6e 6f 74 20 6f 6d 69 74 74 69 6e   are not omittin
02b0: 67 20 74 68 65 0a 2a 2a 20 41 4c 54 45 52 20 54  g the.** ALTER T
02c0: 41 42 4c 45 20 6c 6f 67 69 63 20 66 72 6f 6d 20  ABLE logic from 
02d0: 74 68 65 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69  the build..*/.#i
02e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
02f0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 0a 0a 2f  T_ALTERTABLE.../
0300: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
0310: 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 53 51  on is used by SQ
0320: 4c 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 69  L generated to i
0330: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 0a 2a 2a  mplement the .**
0340: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 63 6f 6d   ALTER TABLE com
0350: 6d 61 6e 64 2e 20 54 68 65 20 66 69 72 73 74 20  mand. The first 
0360: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
0370: 74 65 78 74 20 6f 66 20 61 20 43 52 45 41 54 45  text of a CREATE
0380: 20 54 41 42 4c 45 20 6f 72 0a 2a 2a 20 43 52 45   TABLE or.** CRE
0390: 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  ATE INDEX comman
03a0: 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 69 73  d. The second is
03b0: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54   a table name. T
03c0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  he table name in
03d0: 20 0a 2a 2a 20 74 68 65 20 43 52 45 41 54 45 20   .** the CREATE 
03e0: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
03f0: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
0400: 69 73 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  is replaced with
0410: 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
0420: 72 67 75 6d 65 6e 74 20 61 6e 64 20 74 68 65 20  rgument and the 
0430: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 2e  result returned.
0440: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
0450: 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74   sqlite_rename_t
0460: 61 62 6c 65 28 27 43 52 45 41 54 45 20 54 41 42  able('CREATE TAB
0470: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 27  LE abc(a, b, c)'
0480: 2c 20 27 64 65 66 27 29 0a 2a 2a 20 20 20 20 20  , 'def').**     
0490: 2d 3e 20 27 43 52 45 41 54 45 20 54 41 42 4c 45  -> 'CREATE TABLE
04a0: 20 64 65 66 28 61 2c 20 62 2c 20 63 29 27 0a 2a   def(a, b, c)'.*
04b0: 2a 0a 2a 2a 20 73 71 6c 69 74 65 5f 72 65 6e 61  *.** sqlite_rena
04c0: 6d 65 5f 74 61 62 6c 65 28 27 43 52 45 41 54 45  me_table('CREATE
04d0: 20 49 4e 44 45 58 20 69 20 4f 4e 20 61 62 63 28   INDEX i ON abc(
04e0: 61 29 27 2c 20 27 64 65 66 27 29 0a 2a 2a 20 20  a)', 'def').**  
04f0: 20 20 20 2d 3e 20 27 43 52 45 41 54 45 20 49 4e     -> 'CREATE IN
0500: 44 45 58 20 69 20 4f 4e 20 64 65 66 28 61 2c 20  DEX i ON def(a, 
0510: 62 2c 20 63 29 27 0a 2a 2f 0a 73 74 61 74 69 63  b, c)'.*/.static
0520: 20 76 6f 69 64 20 72 65 6e 61 6d 65 54 61 62 6c   void renameTabl
0530: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
0540: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
0550: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
0560: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
0570: 2a 61 72 67 76 0a 29 7b 0a 20 20 75 6e 73 69 67  *argv.){.  unsig
0580: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
0590: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  zSql = sqlite3_v
05a0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
05b0: 5d 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ]);.  unsigned c
05c0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 61 62 6c  har const *zTabl
05d0: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  eName = sqlite3_
05e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
05f0: 31 5d 29 3b 0a 0a 20 20 69 6e 74 20 74 6f 6b 65  1]);..  int toke
0600: 6e 3b 0a 20 20 54 6f 6b 65 6e 20 74 6e 61 6d 65  n;.  Token tname
0610: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
0620: 72 20 63 6f 6e 73 74 20 2a 7a 43 73 72 20 3d 20  r const *zCsr = 
0630: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6c 65 6e 20  zSql;.  int len 
0640: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
0650: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 72 69  t;..  /* The pri
0660: 6e 63 69 70 6c 65 20 75 73 65 64 20 74 6f 20 6c  nciple used to l
0670: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
0680: 6e 61 6d 65 20 69 6e 20 74 68 65 20 43 52 45 41  name in the CREA
0690: 54 45 20 54 41 42 4c 45 20 0a 20 20 2a 2a 20 73  TE TABLE .  ** s
06a0: 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 61 74  tatement is that
06b0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
06c0: 69 73 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b  is the first tok
06d0: 65 6e 20 74 68 61 74 20 69 73 20 69 6d 6d 65 64  en that is immed
06e0: 69 61 74 65 64 6c 79 0a 20 20 2a 2a 20 66 6f 6c  iatedly.  ** fol
06f0: 6c 6f 77 65 64 20 62 79 20 61 20 6c 65 66 74 20  lowed by a left 
0700: 70 61 72 65 6e 74 68 65 73 69 73 20 2d 20 54 4b  parenthesis - TK
0710: 5f 4c 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _LP..  */.  if( 
0720: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 64 6f 20 7b  zSql ){.    do {
0730: 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  .      /* Store 
0740: 74 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 7a  the token that z
0750: 43 73 72 20 70 6f 69 6e 74 73 20 74 6f 20 69 6e  Csr points to in
0760: 20 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20   tname. */.     
0770: 20 74 6e 61 6d 65 2e 7a 20 3d 20 7a 43 73 72 3b   tname.z = zCsr;
0780: 0a 20 20 20 20 20 20 74 6e 61 6d 65 2e 6e 20 3d  .      tname.n =
0790: 20 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   len;..      /* 
07a0: 41 64 76 61 6e 63 65 20 7a 43 73 72 20 74 6f 20  Advance zCsr to 
07b0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20  the next token. 
07c0: 53 74 6f 72 65 20 74 68 61 74 20 74 6f 6b 65 6e  Store that token
07d0: 20 74 79 70 65 20 69 6e 20 27 74 6f 6b 65 6e 27   type in 'token'
07e0: 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 69  ,.      ** and i
07f0: 74 27 73 20 6c 65 6e 67 74 68 20 69 6e 20 27 6c  t's length in 'l
0800: 65 6e 27 20 28 74 6f 20 62 65 20 75 73 65 64 20  en' (to be used 
0810: 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
0820: 66 20 74 68 69 73 20 6c 6f 6f 70 29 2e 0a 20 20  f this loop)..  
0830: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
0840: 7b 0a 20 20 20 20 20 20 20 20 7a 43 73 72 20 2b  {.        zCsr +
0850: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20 6c  = len;.        l
0860: 65 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  en = sqlite3GetT
0870: 6f 6b 65 6e 28 7a 43 73 72 2c 20 26 74 6f 6b 65  oken(zCsr, &toke
0880: 6e 29 3b 0a 20 20 20 20 20 20 7d 20 77 68 69 6c  n);.      } whil
0890: 65 28 20 74 6f 6b 65 6e 3d 3d 54 4b 5f 53 50 41  e( token==TK_SPA
08a0: 43 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CE );.      asse
08b0: 72 74 28 20 6c 65 6e 3e 30 20 29 3b 0a 20 20 20  rt( len>0 );.   
08c0: 20 7d 20 77 68 69 6c 65 28 20 74 6f 6b 65 6e 21   } while( token!
08d0: 3d 54 4b 5f 4c 50 20 29 3b 0a 0a 20 20 20 20 7a  =TK_LP );..    z
08e0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Ret = sqlite3MPr
08f0: 69 6e 74 66 28 22 25 2e 2a 73 25 51 25 73 22 2c  intf("%.*s%Q%s",
0900: 20 74 6e 61 6d 65 2e 7a 20 2d 20 7a 53 71 6c 2c   tname.z - zSql,
0910: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 7a   zSql, .       z
0920: 54 61 62 6c 65 4e 61 6d 65 2c 20 74 6e 61 6d 65  TableName, tname
0930: 2e 7a 2b 74 6e 61 6d 65 2e 6e 29 3b 0a 20 20 20  .z+tname.n);.   
0940: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0950: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
0960: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 46  et, -1, sqlite3F
0970: 72 65 65 58 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  reeX);.  }.}..#i
0980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0990: 54 5f 54 52 49 47 47 45 52 0a 2f 2a 20 54 68 69  T_TRIGGER./* Thi
09a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
09b0: 65 64 20 62 79 20 53 51 4c 20 67 65 6e 65 72 61  ed by SQL genera
09c0: 74 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ted to implement
09d0: 20 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45   the ALTER TABLE
09e0: 0a 2a 2a 20 41 4c 54 45 52 20 54 41 42 4c 45 20  .** ALTER TABLE 
09f0: 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 66 69 72  command. The fir
0a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  st argument is t
0a10: 68 65 20 74 65 78 74 20 6f 66 20 61 20 43 52 45  he text of a CRE
0a20: 41 54 45 20 54 52 49 47 47 45 52 20 0a 2a 2a 20  ATE TRIGGER .** 
0a30: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 73  statement. The s
0a40: 65 63 6f 6e 64 20 69 73 20 61 20 74 61 62 6c 65  econd is a table
0a50: 20 6e 61 6d 65 2e 20 54 68 65 20 74 61 62 6c 65   name. The table
0a60: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 43 52 45   name in the CRE
0a70: 41 54 45 20 0a 2a 2a 20 54 52 49 47 47 45 52 20  ATE .** TRIGGER 
0a80: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 70  statement is rep
0a90: 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20 73  laced with the s
0aa0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
0ab0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 0a 2a  nd the result .*
0ac0: 2a 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  * returned. This
0ad0: 20 69 73 20 61 6e 61 6c 61 67 6f 75 73 20 74 6f   is analagous to
0ae0: 20 72 65 6e 61 6d 65 54 61 62 6c 65 46 75 6e 63   renameTableFunc
0af0: 28 29 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  () above, except
0b00: 20 66 6f 72 20 43 52 45 41 54 45 0a 2a 2a 20 54   for CREATE.** T
0b10: 52 49 47 47 45 52 2c 20 6e 6f 74 20 43 52 45 41  RIGGER, not CREA
0b20: 54 45 20 49 4e 44 45 58 20 61 6e 64 20 43 52 45  TE INDEX and CRE
0b30: 41 54 45 20 54 41 42 4c 45 2e 0a 2a 2f 0a 73 74  ATE TABLE..*/.st
0b40: 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65  atic void rename
0b50: 54 72 69 67 67 65 72 46 75 6e 63 28 0a 20 20 73  TriggerFunc(.  s
0b60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0b70: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
0b80: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
0b90: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
0ba0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
0bb0: 6f 6e 73 74 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  onst *zSql = sql
0bc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
0bd0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 75 6e 73 69  argv[0]);.  unsi
0be0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
0bf0: 2a 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 73 71  *zTableName = sq
0c00: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
0c10: 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 69 6e  (argv[1]);..  in
0c20: 74 20 74 6f 6b 65 6e 3b 0a 20 20 54 6f 6b 65 6e  t token;.  Token
0c30: 20 74 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 64 69   tname;.  int di
0c40: 73 74 20 3d 20 33 3b 0a 20 20 75 6e 73 69 67 6e  st = 3;.  unsign
0c50: 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  ed char const *z
0c60: 43 73 72 20 3d 20 7a 53 71 6c 3b 0a 20 20 69 6e  Csr = zSql;.  in
0c70: 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  t len = 0;.  cha
0c80: 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 2f 2a 20 54  r *zRet;..  /* T
0c90: 68 65 20 70 72 69 6e 63 69 70 6c 65 20 75 73 65  he principle use
0ca0: 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
0cb0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
0cc0: 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  e CREATE TRIGGER
0cd0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
0ce0: 20 69 73 20 74 68 61 74 20 74 68 65 20 74 61 62   is that the tab
0cf0: 6c 65 20 6e 61 6d 65 20 69 73 20 74 68 65 20 66  le name is the f
0d00: 69 72 73 74 20 74 6f 6b 65 6e 20 74 68 61 74 20  irst token that 
0d10: 69 73 20 69 6d 6d 65 64 69 61 74 65 64 6c 79 0a  is immediatedly.
0d20: 20 20 2a 2a 20 70 72 65 63 65 64 65 64 20 62 79    ** preceded by
0d30: 20 65 69 74 68 65 72 20 54 4b 5f 4f 4e 20 6f 72   either TK_ON or
0d40: 20 54 4b 5f 44 4f 54 20 61 6e 64 20 69 6d 6d 65   TK_DOT and imme
0d50: 64 69 61 74 65 64 6c 79 20 66 6f 6c 6c 6f 77 65  diatedly followe
0d60: 64 20 62 79 20 6f 6e 65 0a 20 20 2a 2a 20 6f 66  d by one.  ** of
0d70: 20 54 4b 5f 57 48 45 4e 2c 20 54 4b 5f 42 45 47   TK_WHEN, TK_BEG
0d80: 49 4e 20 6f 72 20 54 4b 5f 46 4f 52 2e 0a 20 20  IN or TK_FOR..  
0d90: 2a 2f 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  */.  if( zSql ){
0da0: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
0db0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 74 6f 6b  /* Store the tok
0dc0: 65 6e 20 74 68 61 74 20 7a 43 73 72 20 70 6f 69  en that zCsr poi
0dd0: 6e 74 73 20 74 6f 20 69 6e 20 74 6e 61 6d 65 2e  nts to in tname.
0de0: 20 2a 2f 0a 20 20 20 20 20 20 74 6e 61 6d 65 2e   */.      tname.
0df0: 7a 20 3d 20 7a 43 73 72 3b 0a 20 20 20 20 20 20  z = zCsr;.      
0e00: 74 6e 61 6d 65 2e 6e 20 3d 20 6c 65 6e 3b 0a 0a  tname.n = len;..
0e10: 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
0e20: 20 7a 43 73 72 20 74 6f 20 74 68 65 20 6e 65 78   zCsr to the nex
0e30: 74 20 74 6f 6b 65 6e 2e 20 53 74 6f 72 65 20 74  t token. Store t
0e40: 68 61 74 20 74 6f 6b 65 6e 20 74 79 70 65 20 69  hat token type i
0e50: 6e 20 27 74 6f 6b 65 6e 27 2c 0a 20 20 20 20 20  n 'token',.     
0e60: 20 2a 2a 20 61 6e 64 20 69 74 27 73 20 6c 65 6e   ** and it's len
0e70: 67 74 68 20 69 6e 20 27 6c 65 6e 27 20 28 74 6f  gth in 'len' (to
0e80: 20 62 65 20 75 73 65 64 20 6e 65 78 74 20 69 74   be used next it
0e90: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  eration of this 
0ea0: 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
0eb0: 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
0ec0: 20 20 20 7a 43 73 72 20 2b 3d 20 6c 65 6e 3b 0a     zCsr += len;.
0ed0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 71          len = sq
0ee0: 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 7a 43  lite3GetToken(zC
0ef0: 73 72 2c 20 26 74 6f 6b 65 6e 29 3b 0a 20 20 20  sr, &token);.   
0f00: 20 20 20 7d 77 68 69 6c 65 28 20 74 6f 6b 65 6e     }while( token
0f10: 3d 3d 54 4b 5f 53 50 41 43 45 20 29 3b 0a 20 20  ==TK_SPACE );.  
0f20: 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3e      assert( len>
0f30: 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56  0 );..      /* V
0f40: 61 72 69 61 62 6c 65 20 27 64 69 73 74 27 20 73  ariable 'dist' s
0f50: 74 6f 72 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tores the number
0f60: 20 6f 66 20 74 6f 6b 65 6e 73 20 72 65 61 64 20   of tokens read 
0f70: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 0a 20  since the most. 
0f80: 20 20 20 20 20 2a 2a 20 72 65 63 65 6e 74 20 54       ** recent T
0f90: 4b 5f 44 4f 54 20 6f 72 20 54 4b 5f 4f 4e 2e 20  K_DOT or TK_ON. 
0fa0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
0fb0: 77 68 65 6e 20 61 20 57 48 45 4e 2c 20 46 4f 52  when a WHEN, FOR
0fc0: 20 6f 72 20 42 45 47 49 4e 20 0a 20 20 20 20 20   or BEGIN .     
0fd0: 20 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 72 65 61   ** token is rea
0fe0: 64 20 61 6e 64 20 27 64 69 73 74 27 20 65 71 75  d and 'dist' equ
0ff0: 61 6c 73 20 32 2c 20 74 68 65 20 63 6f 6e 64 69  als 2, the condi
1000: 74 69 6f 6e 20 73 74 61 74 65 64 20 61 62 6f 76  tion stated abov
1010: 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65  e.      ** to be
1020: 20 6d 65 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   met..      **. 
1030: 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
1040: 74 20 4f 4e 20 63 61 6e 6e 6f 74 20 62 65 20 61  t ON cannot be a
1050: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
1060: 20 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c   or column name,
1070: 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   so.      ** the
1080: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1090: 20 77 6f 72 72 79 20 61 62 6f 75 74 20 73 79 6e   worry about syn
10a0: 74 61 78 20 6c 69 6b 65 20 0a 20 20 20 20 20 20  tax like .      
10b0: 2a 2a 20 22 43 52 45 41 54 45 20 54 52 49 47 47  ** "CREATE TRIGG
10c0: 45 52 20 2e 2e 2e 20 4f 4e 20 4f 4e 2e 4f 4e 20  ER ... ON ON.ON 
10d0: 42 45 47 49 4e 20 2e 2e 2e 22 20 65 74 63 2e 0a  BEGIN ..." etc..
10e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
10f0: 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ist++;.      if(
1100: 20 74 6f 6b 65 6e 3d 3d 54 4b 5f 44 4f 54 20 7c   token==TK_DOT |
1110: 7c 20 74 6f 6b 65 6e 3d 3d 54 4b 5f 4f 4e 20 29  | token==TK_ON )
1120: 7b 0a 20 20 20 20 20 20 20 20 64 69 73 74 20 3d  {.        dist =
1130: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1140: 7d 20 77 68 69 6c 65 28 20 64 69 73 74 21 3d 32  } while( dist!=2
1150: 20 7c 7c 20 28 74 6f 6b 65 6e 21 3d 54 4b 5f 57   || (token!=TK_W
1160: 48 45 4e 20 26 26 20 74 6f 6b 65 6e 21 3d 54 4b  HEN && token!=TK
1170: 5f 46 4f 52 20 26 26 20 74 6f 6b 65 6e 21 3d 54  _FOR && token!=T
1180: 4b 5f 42 45 47 49 4e 29 20 29 3b 0a 0a 20 20 20  K_BEGIN) );..   
1190: 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 74 6e 61   /* Variable tna
11a0: 6d 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  me now contains 
11b0: 74 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 69  the token that i
11c0: 73 20 74 68 65 20 6f 6c 64 20 74 61 62 6c 65 2d  s the old table-
11d0: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  name.    ** in t
11e0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
11f0: 52 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  R statement..   
1200: 20 2a 2f 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   */.    zRet = s
1210: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
1220: 2e 2a 73 25 51 25 73 22 2c 20 74 6e 61 6d 65 2e  .*s%Q%s", tname.
1230: 7a 20 2d 20 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20  z - zSql, zSql, 
1240: 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 4e 61  .       zTableNa
1250: 6d 65 2c 20 74 6e 61 6d 65 2e 7a 2b 74 6e 61 6d  me, tname.z+tnam
1260: 65 2e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e.n);.    sqlite
1270: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
1280: 6e 74 65 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c  ntext, zRet, -1,
1290: 20 73 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a   sqlite3FreeX);.
12a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 20 2f    }.}.#endif   /
12b0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
12c0: 52 49 47 47 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  RIGGER */../*.**
12d0: 20 52 65 67 69 73 74 65 72 20 62 75 69 6c 74 2d   Register built-
12e0: 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  in functions use
12f0: 64 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d  d to help implem
1300: 65 6e 74 20 41 4c 54 45 52 20 54 41 42 4c 45 0a  ent ALTER TABLE.
1310: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
1320: 6c 74 65 72 46 75 6e 63 74 69 6f 6e 73 28 73 71  lterFunctions(sq
1330: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
1340: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1350: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
1360: 4e 61 6d 65 3b 0a 20 20 20 20 20 73 69 67 6e 65  Name;.     signe
1370: 64 20 63 68 61 72 20 6e 41 72 67 3b 0a 20 20 20  d char nArg;.   
1380: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
1390: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
13a0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
13b0: 75 65 20 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e  ue **);.  } aFun
13c0: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  cs[] = {.    { "
13d0: 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61  sqlite_rename_ta
13e0: 62 6c 65 22 2c 20 20 20 20 32 2c 20 72 65 6e 61  ble",    2, rena
13f0: 6d 65 54 61 62 6c 65 46 75 6e 63 7d 2c 0a 23 69  meTableFunc},.#i
1400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1410: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 7b 20  T_TRIGGER.    { 
1420: 22 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74  "sqlite_rename_t
1430: 72 69 67 67 65 72 22 2c 20 20 32 2c 20 72 65 6e  rigger",  2, ren
1440: 61 6d 65 54 72 69 67 67 65 72 46 75 6e 63 7d 2c  ameTriggerFunc},
1450: 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69  .#endif.  };.  i
1460: 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nt i;..  for(i=0
1470: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63  ; i<sizeof(aFunc
1480: 73 29 2f 73 69 7a 65 6f 66 28 61 46 75 6e 63 73  s)/sizeof(aFuncs
1490: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
14a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14b0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e  unction(db, aFun
14c0: 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75  cs[i].zName, aFu
14d0: 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20  ncs[i].nArg,.   
14e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14f0: 2c 20 30 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78  , 0, aFuncs[i].x
1500: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
1510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1520: 74 65 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  te the text of a
1530: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1540: 6e 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  n which can be u
1550: 73 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 6c  sed to select al
1560: 6c 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74  l.** temporary t
1570: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
1580: 20 70 54 61 62 20 66 72 6f 6d 20 74 68 65 20 73   pTab from the s
1590: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
15a0: 72 20 74 61 62 6c 65 2e 20 49 66 0a 2a 2a 20 74  r table. If.** t
15b0: 61 62 6c 65 20 70 54 61 62 20 68 61 73 20 6e 6f  able pTab has no
15c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67   temporary trigg
15d0: 65 72 73 2c 20 6f 72 20 69 73 20 69 74 73 65 6c  ers, or is itsel
15e0: 66 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  f stored in the 
15f0: 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 64 61  .** temporary da
1600: 74 61 62 61 73 65 2c 20 4e 55 4c 4c 20 69 73 20  tabase, NULL is 
1610: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1620: 74 69 63 20 63 68 61 72 20 2a 77 68 65 72 65 54  tic char *whereT
1630: 65 6d 70 54 72 69 67 67 65 72 73 28 50 61 72 73  empTriggers(Pars
1640: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
1650: 20 2a 70 54 61 62 29 7b 0a 20 20 54 72 69 67 67   *pTab){.  Trigg
1660: 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 63 68 61  er *pTrig;.  cha
1670: 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
1680: 20 63 68 61 72 20 2a 74 6d 70 20 3d 20 30 3b 0a   char *tmp = 0;.
1690: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 44 62 21    if( pTab->iDb!
16a0: 3d 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 20 70  =1 ){.    for( p
16b0: 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72 69 67  Trig=pTab->pTrig
16c0: 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54 72 69  ger; pTrig; pTri
16d0: 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74 20 29  g=pTrig->pNext )
16e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  {.      if( pTri
16f0: 67 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  g->iDb==1 ){.   
1700: 20 20 20 20 20 69 66 28 20 21 7a 57 68 65 72 65       if( !zWhere
1710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 57   ){.          zW
1720: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  here = sqlite3MP
1730: 72 69 6e 74 66 28 22 6e 61 6d 65 3d 25 51 22 2c  rintf("name=%Q",
1740: 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20   pTrig->name);. 
1750: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1760: 20 20 20 20 20 20 20 20 74 6d 70 20 3d 20 7a 57          tmp = zW
1770: 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20 20 20  here;.          
1780: 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  zWhere = sqlite3
1790: 4d 50 72 69 6e 74 66 28 22 25 73 20 4f 52 20 6e  MPrintf("%s OR n
17a0: 61 6d 65 3d 25 51 22 2c 20 7a 57 68 65 72 65 2c  ame=%Q", zWhere,
17b0: 20 70 54 72 69 67 2d 3e 6e 61 6d 65 29 3b 0a 20   pTrig->name);. 
17c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
17d0: 72 65 65 28 74 6d 70 29 3b 0a 20 20 20 20 20 20  ree(tmp);.      
17e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  }.  }.  return z
1800: 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Where;.}../*.** 
1810: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1820: 20 64 72 6f 70 20 61 6e 64 20 72 65 6c 6f 61 64   drop and reload
1830: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65   the internal re
1840: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1850: 74 61 62 6c 65 0a 2a 2a 20 70 54 61 62 20 66 72  table.** pTab fr
1860: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
1870: 20 69 6e 63 6c 75 64 69 6e 67 20 74 72 69 67 67   including trigg
1880: 65 72 73 20 61 6e 64 20 74 65 6d 70 6f 72 61 72  ers and temporar
1890: 79 20 74 72 69 67 67 65 72 73 2e 0a 2a 2a 20 41  y triggers..** A
18a0: 72 67 75 6d 65 6e 74 20 7a 4e 61 6d 65 20 69 73  rgument zName is
18b0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
18c0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
18d0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61 74  tabase schema at
18e0: 0a 2a 2a 20 74 68 65 20 74 69 6d 65 20 74 68 65  .** the time the
18f0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
1900: 69 73 20 65 78 65 63 75 74 65 64 2e 20 54 68 69  is executed. Thi
1910: 73 20 63 61 6e 20 62 65 20 64 69 66 66 65 72 65  s can be differe
1920: 6e 74 20 66 72 6f 6d 0a 2a 2a 20 70 54 61 62 2d  nt from.** pTab-
1930: 3e 7a 4e 61 6d 65 20 69 66 20 74 68 69 73 20 66  >zName if this f
1940: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
1950: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20   called to code 
1960: 70 61 72 74 20 6f 66 20 61 6e 20 0a 2a 2a 20 22  part of an .** "
1970: 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41  ALTER TABLE RENA
1980: 4d 45 20 54 4f 22 20 73 74 61 74 65 6d 65 6e 74  ME TO" statement
1990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19a0: 20 72 65 6c 6f 61 64 54 61 62 6c 65 53 63 68 65   reloadTableSche
19b0: 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
19c0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
19d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
19e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
19f0: 63 68 61 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20  char *zWhere;.  
1a00: 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66  int iDb;.#ifndef
1a10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
1a20: 47 47 45 52 0a 20 20 54 72 69 67 67 65 72 20 2a  GGER.  Trigger *
1a30: 70 54 72 69 67 3b 0a 23 65 6e 64 69 66 0a 0a 20  pTrig;.#endif.. 
1a40: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1a50: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1a60: 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
1a70: 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
1a80: 62 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b;..#ifndef SQLI
1a90: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1aa0: 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 74 61    /* Drop any ta
1ab0: 62 6c 65 20 74 72 69 67 67 65 72 73 20 66 72 6f  ble triggers fro
1ac0: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  m the internal s
1ad0: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 66 6f 72 28  chema. */.  for(
1ae0: 70 54 72 69 67 3d 70 54 61 62 2d 3e 70 54 72 69  pTrig=pTab->pTri
1af0: 67 67 65 72 3b 20 70 54 72 69 67 3b 20 70 54 72  gger; pTrig; pTr
1b00: 69 67 3d 70 54 72 69 67 2d 3e 70 4e 65 78 74 29  ig=pTrig->pNext)
1b10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1b20: 72 69 67 2d 3e 69 44 62 3d 3d 69 44 62 20 7c 7c  rig->iDb==iDb ||
1b30: 20 70 54 72 69 67 2d 3e 69 44 62 3d 3d 31 20 29   pTrig->iDb==1 )
1b40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b50: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
1b60: 72 69 67 67 65 72 2c 20 70 54 72 69 67 2d 3e 69  rigger, pTrig->i
1b70: 44 62 2c 20 30 2c 20 70 54 72 69 67 2d 3e 6e 61  Db, 0, pTrig->na
1b80: 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
1b90: 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 74 68  if..  /* Drop th
1ba0: 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  e table and inde
1bb0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  x from the inter
1bc0: 6e 61 6c 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  nal schema */.  
1bd0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
1be0: 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
1bf0: 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  iDb, 0, pTab->zN
1c00: 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 52  ame, 0);..  /* R
1c10: 65 6c 6f 61 64 20 74 68 65 20 74 61 62 6c 65 2c  eload the table,
1c20: 20 69 6e 64 65 78 20 61 6e 64 20 70 65 72 6d 61   index and perma
1c30: 6e 65 6e 74 20 74 72 69 67 67 65 72 20 73 63 68  nent trigger sch
1c40: 65 6d 61 73 2e 20 2a 2f 0a 20 20 7a 57 68 65 72  emas. */.  zWher
1c50: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1c60: 74 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 25 51 22  tf("tbl_name=%Q"
1c70: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
1c80: 21 7a 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  !zWhere ) return
1c90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ;.  sqlite3VdbeO
1ca0: 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p3(v, OP_ParseSc
1cb0: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 7a 57  hema, iDb, 0, zW
1cc0: 68 65 72 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  here, P3_DYNAMIC
1cd0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1ce0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1cf0: 20 20 2f 2a 20 4e 6f 77 2c 20 69 66 20 74 68 65    /* Now, if the
1d00: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 74   table is not st
1d10: 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ored in the temp
1d20: 20 64 61 74 61 62 61 73 65 2c 20 72 65 6c 6f 61   database, reloa
1d30: 64 20 61 6e 79 20 74 65 6d 70 20 0a 20 20 2a 2a  d any temp .  **
1d40: 20 74 72 69 67 67 65 72 73 2e 20 44 6f 6e 27 74   triggers. Don't
1d50: 20 75 73 65 20 49 4e 28 2e 2e 2e 29 20 69 6e 20   use IN(...) in 
1d60: 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54  case SQLITE_OMIT
1d70: 5f 53 55 42 51 55 45 52 59 20 69 73 20 64 65 66  _SUBQUERY is def
1d80: 69 6e 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ined. .  */.  if
1d90: 28 20 28 7a 57 68 65 72 65 3d 77 68 65 72 65 54  ( (zWhere=whereT
1da0: 65 6d 70 54 72 69 67 67 65 72 73 28 70 50 61 72  empTriggers(pPar
1db0: 73 65 2c 20 70 54 61 62 29 29 20 29 7b 0a 20 20  se, pTab)) ){.  
1dc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
1dd0: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
1de0: 6d 61 2c 20 31 2c 20 30 2c 20 7a 57 68 65 72 65  ma, 1, 0, zWhere
1df0: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
1e00: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
1e10: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e20: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e30: 65 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78  e "ALTER TABLE x
1e40: 78 78 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79  xx RENAME TO yyy
1e50: 22 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a  " .** command. .
1e60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
1e70: 6c 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28  lterRenameTable(
1e80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ea0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  Parser context. 
1eb0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1ec0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
1ed0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72  * The table to r
1ee0: 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65  ename. */.  Toke
1ef0: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1f10: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
1f20: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f40: 2a 20 44 61 74 61 62 61 73 65 20 74 68 61 74 20  * Database that 
1f50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
1f60: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
1f70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1f80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
1f90: 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54  abase iDb */.  T
1fa0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1fc0: 65 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  e being renamed 
1fd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
1fe0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1ff0: 2a 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65  * NULL-terminate
2000: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61  d version of pNa
2010: 6d 65 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  me */ .  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  b; /* Database c
2040: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
2050: 64 62 65 20 2a 76 3b 0a 23 69 66 6e 64 65 66 20  dbe *v;.#ifndef 
2060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
2070: 47 45 52 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  GER.  char *zWhe
2080: 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  re = 0;         
2090: 2f 2a 20 57 68 65 72 65 20 63 6c 61 75 73 65 20  /* Where clause 
20a0: 74 6f 20 6c 6f 63 61 74 65 20 74 65 6d 70 20 74  to locate temp t
20b0: 72 69 67 67 65 72 73 20 2a 2f 0a 23 65 6e 64 69  riggers */.#endi
20c0: 66 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  f.  .  assert( p
20d0: 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  Src->nSrc==1 );.
20e0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
20f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2100: 72 73 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  rse, pSrc->a[0].
2110: 7a 4e 61 6d 65 2c 20 70 53 72 63 2d 3e 61 5b 30  zName, pSrc->a[0
2120: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
2130: 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
2140: 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62   exit_rename_tab
2150: 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62  le;.  iDb = pTab
2160: 2d 3e 69 44 62 3b 0a 20 20 7a 44 62 20 3d 20 64  ->iDb;.  zDb = d
2170: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
2180: 65 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e  e;..  /* Get a N
2190: 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20 76  ULL terminated v
21a0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  ersion of the ne
21b0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f  w table name. */
21c0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
21d0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21e0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a  pName);.  if( !z
21f0: 4e 61 6d 65 20 29 20 67 6f 74 6f 20 65 78 69 74  Name ) goto exit
2200: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 0a  _rename_table;..
2210: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2220: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
2230: 20 6e 61 6d 65 64 20 27 7a 4e 61 6d 65 27 20 64   named 'zName' d
2240: 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2250: 65 78 69 73 74 0a 20 20 2a 2a 20 69 6e 20 64 61  exist.  ** in da
2260: 74 61 62 61 73 65 20 69 44 62 2e 20 49 66 20 73  tabase iDb. If s
2270: 6f 2c 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  o, this is an er
2280: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
2290: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
22a0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
22b0: 20 7c 7c 20 73 71 6c 69 74 65 33 46 69 6e 64 49   || sqlite3FindI
22c0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
22d0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  zDb) ){.    sqli
22e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22f0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 74 68  se, .        "th
2300: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
2310: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20  nother table or 
2320: 69 6e 64 65 78 20 77 69 74 68 20 74 68 69 73 20  index with this 
2330: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
2340: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
2350: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20  _rename_table;. 
2360: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
2370: 72 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 73  re it is not a s
2380: 79 73 74 65 6d 20 74 61 62 6c 65 20 62 65 69 6e  ystem table bein
2390: 67 20 61 6c 74 65 72 65 64 2c 20 6f 72 20 61 20  g altered, or a 
23a0: 72 65 73 65 72 76 65 64 20 6e 61 6d 65 0a 20 20  reserved name.  
23b0: 2a 2a 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ** that the tabl
23c0: 65 20 69 73 20 62 65 69 6e 67 20 72 65 6e 61 6d  e is being renam
23d0: 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  ed to..  */.  if
23e0: 28 20 73 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a  ( strlen(pTab->z
23f0: 4e 61 6d 65 29 3e 36 20 26 26 20 30 3d 3d 73 71  Name)>6 && 0==sq
2400: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
2410: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
2420: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
2430: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2440: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
2450: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74  s may not be alt
2460: 65 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ered", pTab->zNa
2470: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
2480: 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b  it_rename_table;
2490: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
24a0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
24b0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
24c0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
24d0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e     goto exit_ren
24e0: 61 6d 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  ame_table;.  }..
24f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2500: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
2510: 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  N.  /* Invoke th
2520: 65 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  e authorization 
2530: 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 69  callback. */.  i
2540: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
2550: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2560: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20  TE_ALTER_TABLE, 
2570: 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  zDb, pTab->zName
2580: 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
2590: 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62   exit_rename_tab
25a0: 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
25b0: 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61    /* Begin a tra
25c0: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 63 6f 64  nsaction and cod
25d0: 65 20 74 68 65 20 56 65 72 69 66 79 43 6f 6f 6b  e the VerifyCook
25e0: 69 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ie for database 
25f0: 69 44 62 2e 20 0a 20 20 2a 2a 20 54 68 65 6e 20  iDb. .  ** Then 
2600: 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d  modify the schem
2610: 61 20 63 6f 6f 6b 69 65 20 28 73 69 6e 63 65 20  a cookie (since 
2620: 74 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20  the ALTER TABLE 
2630: 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 20 20 2a  modifies the.  *
2640: 2a 20 73 63 68 65 6d 61 29 2e 0a 20 20 2a 2f 0a  * schema)..  */.
2650: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
2660: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
2670: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
2680: 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65  goto exit_rename
2690: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71  _table;.  }.  sq
26a0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
26b0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
26c0: 20 30 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69   0, iDb);.  sqli
26d0: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
26e0: 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a 20 20  db, v, iDb);..  
26f0: 2f 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 73 71  /* Modify the sq
2700: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
2710: 65 20 74 6f 20 75 73 65 20 74 68 65 20 6e 65 77  e to use the new
2720: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
2730: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2740: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
2750: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
2760: 20 53 45 54 20 22 0a 23 69 66 64 65 66 20 53 51   SET ".#ifdef SQ
2770: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
2780: 52 0a 20 20 20 20 20 20 20 20 20 20 22 73 71 6c  R.          "sql
2790: 20 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65   = sqlite_rename
27a0: 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25 51 29 2c  _table(sql, %Q),
27b0: 20 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   ".#else.       
27c0: 20 20 20 22 73 71 6c 20 3d 20 43 41 53 45 20 22     "sql = CASE "
27d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48  .            "WH
27e0: 45 4e 20 74 79 70 65 20 3d 20 27 74 72 69 67 67  EN type = 'trigg
27f0: 65 72 27 20 54 48 45 4e 20 73 71 6c 69 74 65 5f  er' THEN sqlite_
2800: 72 65 6e 61 6d 65 5f 74 72 69 67 67 65 72 28 73  rename_trigger(s
2810: 71 6c 2c 20 25 51 29 22 0a 20 20 20 20 20 20 20  ql, %Q)".       
2820: 20 20 20 20 20 22 45 4c 53 45 20 73 71 6c 69 74       "ELSE sqlit
2830: 65 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 28 73  e_rename_table(s
2840: 71 6c 2c 20 25 51 29 20 45 4e 44 2c 20 22 0a 23  ql, %Q) END, ".#
2850: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2860: 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c 20  "tbl_name = %Q, 
2870: 22 0a 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d  ".          "nam
2880: 65 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20 20  e = CASE ".     
2890: 20 20 20 20 20 20 20 22 57 48 45 4e 20 74 79 70         "WHEN typ
28a0: 65 3d 27 74 61 62 6c 65 27 20 54 48 45 4e 20 25  e='table' THEN %
28b0: 51 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q ".            
28c0: 22 57 48 45 4e 20 6e 61 6d 65 20 4c 49 4b 45 20  "WHEN name LIKE 
28d0: 27 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  'sqlite_autoinde
28e0: 78 25 25 27 20 41 4e 44 20 74 79 70 65 3d 27 69  x%%' AND type='i
28f0: 6e 64 65 78 27 20 54 48 45 4e 20 22 0a 20 20 20  ndex' THEN ".   
2900: 20 20 20 20 20 20 20 20 20 20 20 22 27 73 71 6c             "'sql
2910: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 27 20  ite_autoindex_' 
2920: 7c 7c 20 25 51 20 7c 7c 20 73 75 62 73 74 72 28  || %Q || substr(
2930: 6e 61 6d 65 2c 20 25 64 2b 31 38 2c 31 30 29 20  name, %d+18,10) 
2940: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ".            "E
2950: 4c 53 45 20 6e 61 6d 65 20 45 4e 44 20 22 0a 20  LSE name END ". 
2960: 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f       "WHERE tbl_
2970: 6e 61 6d 65 3d 25 51 20 41 4e 44 20 22 0a 20 20  name=%Q AND ".  
2980: 20 20 20 20 20 20 20 20 22 28 74 79 70 65 3d 27          "(type='
2990: 74 61 62 6c 65 27 20 4f 52 20 74 79 70 65 3d 27  table' OR type='
29a0: 69 6e 64 65 78 27 20 4f 52 20 74 79 70 65 3d 27  index' OR type='
29b0: 74 72 69 67 67 65 72 27 29 3b 22 2c 20 0a 20 20  trigger');", .  
29c0: 20 20 20 20 7a 44 62 2c 20 53 43 48 45 4d 41 5f      zDb, SCHEMA_
29d0: 54 41 42 4c 45 28 69 44 62 29 2c 20 7a 4e 61 6d  TABLE(iDb), zNam
29e0: 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  e, zName, zName,
29f0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2a00: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
2a10: 20 20 20 20 7a 4e 61 6d 65 2c 0a 23 65 6e 64 69      zName,.#endi
2a20: 66 0a 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 73  f.      zName, s
2a30: 74 72 6c 65 6e 28 70 54 61 62 2d 3e 7a 4e 61 6d  trlen(pTab->zNam
2a40: 65 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  e), pTab->zName.
2a50: 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51    );..#ifndef SQ
2a60: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
2a70: 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 49 66 20  CREMENT.  /* If 
2a80: 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
2a90: 6e 63 65 20 74 61 62 6c 65 20 65 78 69 73 74 73  nce table exists
2aa0: 20 69 6e 20 74 68 69 73 20 64 61 74 61 62 61 73   in this databas
2ab0: 65 2c 20 74 68 65 6e 20 75 70 64 61 74 65 20 0a  e, then update .
2ac0: 20 20 2a 2a 20 69 74 20 77 69 74 68 20 74 68 65    ** it with the
2ad0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e   new table name.
2ae0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
2af0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
2b00: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
2b10: 65 22 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  e", zDb) ){.    
2b20: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
2b30: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
2b40: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 73 71     "UPDATE %Q.sq
2b50: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 73 65  lite_sequence se
2b60: 74 20 6e 61 6d 65 20 3d 20 25 51 20 57 48 45 52  t name = %Q WHER
2b70: 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 0a 20 20  E name = %Q",.  
2b80: 20 20 20 20 20 20 7a 44 62 2c 20 7a 4e 61 6d 65        zDb, zName
2b90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2ba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
2bb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2bc0: 54 52 49 47 47 45 52 0a 20 20 2f 2a 20 49 66 20  TRIGGER.  /* If 
2bd0: 74 68 65 72 65 20 61 72 65 20 54 45 4d 50 20 74  there are TEMP t
2be0: 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73 20  riggers on this 
2bf0: 74 61 62 6c 65 2c 20 6d 6f 64 69 66 79 20 74 68  table, modify th
2c00: 65 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  e sqlite_temp_ma
2c10: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  ster.  ** table.
2c20: 20 44 6f 6e 27 74 20 64 6f 20 74 68 69 73 20 69   Don't do this i
2c30: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
2c40: 67 20 41 4c 54 45 52 65 64 20 69 73 20 69 74 73  g ALTERed is its
2c50: 65 6c 66 20 6c 6f 63 61 74 65 64 20 69 6e 0a 20  elf located in. 
2c60: 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 64 61 74   ** the temp dat
2c70: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
2c80: 28 20 28 7a 57 68 65 72 65 3d 77 68 65 72 65 54  ( (zWhere=whereT
2c90: 65 6d 70 54 72 69 67 67 65 72 73 28 70 50 61 72  empTriggers(pPar
2ca0: 73 65 2c 20 70 54 61 62 29 29 20 29 7b 0a 20 20  se, pTab)) ){.  
2cb0: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2cc0: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
2cd0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 73 71        "UPDATE sq
2ce0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2cf0: 20 53 45 54 20 22 0a 20 20 20 20 20 20 20 20 20   SET ".         
2d00: 20 20 20 22 73 71 6c 20 3d 20 73 71 6c 69 74 65     "sql = sqlite
2d10: 5f 72 65 6e 61 6d 65 5f 74 72 69 67 67 65 72 28  _rename_trigger(
2d20: 73 71 6c 2c 20 25 51 29 2c 20 22 0a 20 20 20 20  sql, %Q), ".    
2d30: 20 20 20 20 20 20 20 20 22 74 62 6c 5f 6e 61 6d          "tbl_nam
2d40: 65 20 3d 20 25 51 20 22 0a 20 20 20 20 20 20 20  e = %Q ".       
2d50: 20 20 20 20 20 22 57 48 45 52 45 20 25 73 3b 22       "WHERE %s;"
2d60: 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , zName, zName, 
2d70: 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  zWhere);.    sql
2d80: 69 74 65 46 72 65 65 28 7a 57 68 65 72 65 29 3b  iteFree(zWhere);
2d90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2da0: 2a 20 44 72 6f 70 20 61 6e 64 20 72 65 6c 6f 61  * Drop and reloa
2db0: 64 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74  d the internal t
2dc0: 61 62 6c 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a  able schema. */.
2dd0: 20 20 72 65 6c 6f 61 64 54 61 62 6c 65 53 63 68    reloadTableSch
2de0: 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
2df0: 2c 20 7a 4e 61 6d 65 29 3b 0a 0a 65 78 69 74 5f  , zName);..exit_
2e00: 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3a 0a 20 20  rename_table:.  
2e10: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
2e20: 6c 65 74 65 28 70 53 72 63 29 3b 0a 20 20 73 71  lete(pSrc);.  sq
2e30: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
2e40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
2e50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2e60: 65 64 20 61 66 74 65 72 20 61 6e 20 22 41 4c 54  ed after an "ALT
2e70: 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 41 44 44  ER TABLE ... ADD
2e80: 22 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 68  " statement.** h
2e90: 61 73 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20  as been parsed. 
2ea0: 41 72 67 75 6d 65 6e 74 20 70 43 6f 6c 44 65 66  Argument pColDef
2eb0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65   contains the te
2ec0: 78 74 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a  xt of the new.**
2ed0: 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
2ee0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  on..**.** The Ta
2ef0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 50  ble structure pP
2f00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
2f10: 77 61 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20  was extended to 
2f20: 69 6e 63 6c 75 64 65 0a 2a 2a 20 74 68 65 20 6e  include.** the n
2f30: 65 77 20 63 6f 6c 75 6d 6e 20 64 75 72 69 6e 67  ew column during
2f40: 20 70 61 72 73 69 6e 67 2e 0a 2a 2f 0a 76 6f 69   parsing..*/.voi
2f50: 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69  d sqlite3AlterFi
2f60: 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 50 61  nishAddColumn(Pa
2f70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
2f80: 65 6e 20 2a 70 43 6f 6c 44 65 66 29 7b 0a 20 20  en *pColDef){.  
2f90: 54 61 62 6c 65 20 2a 70 4e 65 77 3b 20 20 20 20  Table *pNew;    
2fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
2fb0: 79 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 4e 65  y of pParse->pNe
2fc0: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 54 61 62 6c  wTable */.  Tabl
2fd0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
2fe0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2ff0: 65 69 6e 67 20 61 6c 74 65 72 65 64 20 2a 2f 0a  eing altered */.
3000: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
3010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3020: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
3030: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3040: 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  zDb;          /*
3050: 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
3060: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3070: 7a 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  zTab;         /*
3080: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
3090: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 20 20 20 20   char *zCol;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30b0: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 63 6f  ll-terminated co
30c0: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  lumn definition 
30d0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  */.  Column *pCo
30e0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
30f0: 2a 20 54 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  * The new column
3100: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44 66 6c   */.  Expr *pDfl
3110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3120: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
3130: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63 6f 6c   for the new col
3140: 75 6d 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  umn */.  Vdbe *v
3150: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
3160: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
3170: 20 20 70 4e 65 77 20 3d 20 70 50 61 72 73 65 2d    pNew = pParse-
3180: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 61 73  >pNewTable;.  as
3190: 73 65 72 74 28 20 70 4e 65 77 20 29 3b 0a 0a 20  sert( pNew );.. 
31a0: 20 69 44 62 20 3d 20 70 4e 65 77 2d 3e 69 44 62   iDb = pNew->iDb
31b0: 3b 0a 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65  ;.  zDb = pParse
31c0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
31d0: 4e 61 6d 65 3b 0a 20 20 7a 54 61 62 20 3d 20 70  Name;.  zTab = p
31e0: 4e 65 77 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 70 43  New->zName;.  pC
31f0: 6f 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 43 6f 6c  ol = &pNew->aCol
3200: 5b 70 4e 65 77 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  [pNew->nCol-1];.
3210: 20 20 70 44 66 6c 74 20 3d 20 70 43 6f 6c 2d 3e    pDflt = pCol->
3220: 70 44 66 6c 74 3b 0a 20 20 70 54 61 62 20 3d 20  pDflt;.  pTab = 
3230: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
3240: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61  (pParse->db, zTa
3250: 62 2c 20 7a 44 62 29 3b 0a 20 20 61 73 73 65 72  b, zDb);.  asser
3260: 74 28 20 70 54 61 62 20 29 3b 0a 0a 20 20 2f 2a  t( pTab );..  /*
3270: 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   If the default 
3280: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6e 65  value for the ne
3290: 77 20 63 6f 6c 75 6d 6e 20 77 61 73 20 73 70 65  w column was spe
32a0: 63 69 66 69 65 64 20 77 69 74 68 20 61 20 0a 20  cified with a . 
32b0: 20 2a 2a 20 6c 69 74 65 72 61 6c 20 4e 55 4c 4c   ** literal NULL
32c0: 2c 20 74 68 65 6e 20 73 65 74 20 70 44 66 6c 74  , then set pDflt
32d0: 20 74 6f 20 30 2e 20 54 68 69 73 20 73 69 6d 70   to 0. This simp
32e0: 6c 69 66 69 65 73 20 63 68 65 63 6b 69 6e 67 0a  lifies checking.
32f0: 20 20 2a 2a 20 66 6f 72 20 61 6e 20 53 51 4c 20    ** for an SQL 
3300: 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20 62 65 6c  NULL default bel
3310: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ow..  */.  if( p
3320: 44 66 6c 74 20 26 26 20 70 44 66 6c 74 2d 3e 6f  Dflt && pDflt->o
3330: 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20  p==TK_NULL ){.  
3340: 20 20 70 44 66 6c 74 20 3d 20 30 3b 0a 20 20 7d    pDflt = 0;.  }
3350: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
3360: 74 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  t the new column
3370: 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65   is not specifie
3380: 64 20 61 73 20 50 52 49 4d 41 52 59 20 4b 45 59  d as PRIMARY KEY
3390: 20 6f 72 20 55 4e 49 51 55 45 2e 0a 20 20 2a 2a   or UNIQUE..  **
33a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 4e   If there is a N
33b0: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
33c0: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66  nt, then the def
33d0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
33e0: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6d  he.  ** column m
33f0: 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
3400: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
3410: 2d 3e 69 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20  ->isPrimKey ){. 
3420: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3430: 73 67 28 70 50 61 72 73 65 2c 20 22 43 61 6e 6e  sg(pParse, "Cann
3440: 6f 74 20 61 64 64 20 61 20 50 52 49 4d 41 52 59  ot add a PRIMARY
3450: 20 4b 45 59 20 63 6f 6c 75 6d 6e 22 29 3b 0a 20   KEY column");. 
3460: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3470: 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 64 65   if( pNew->pInde
3480: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
3490: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
34a0: 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 55   "Cannot add a U
34b0: 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 22 29 3b 0a  NIQUE column");.
34c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
34d0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 6e 6f 74 4e    if( pCol->notN
34e0: 75 6c 6c 20 26 26 20 21 70 44 66 6c 74 20 29 7b  ull && !pDflt ){
34f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
3500: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
3510: 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 61 64        "Cannot ad
3520: 64 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  d a NOT NULL col
3530: 75 6d 6e 20 77 69 74 68 20 64 65 66 61 75 6c 74  umn with default
3540: 20 76 61 6c 75 65 20 4e 55 4c 4c 22 29 3b 0a 20   value NULL");. 
3550: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
3560: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
3570: 64 65 66 61 75 6c 74 20 65 78 70 72 65 73 73 69  default expressi
3580: 6f 6e 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  on is something 
3590: 74 68 61 74 20 73 71 6c 69 74 65 33 56 61 6c 75  that sqlite3Valu
35a0: 65 46 72 6f 6d 45 78 70 72 28 29 0a 20 20 2a 2a  eFromExpr().  **
35b0: 20 63 61 6e 20 68 61 6e 64 6c 65 20 28 69 2e 65   can handle (i.e
35c0: 2e 20 6e 6f 74 20 43 55 52 52 45 4e 54 5f 54 49  . not CURRENT_TI
35d0: 4d 45 20 65 74 63 2e 29 0a 20 20 2a 2f 0a 20 20  ME etc.).  */.  
35e0: 69 66 28 20 70 44 66 6c 74 20 29 7b 0a 20 20 20  if( pDflt ){.   
35f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3600: 70 56 61 6c 3b 0a 20 20 20 20 69 66 28 20 73 71  pVal;.    if( sq
3610: 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
3620: 70 72 28 70 44 66 6c 74 2c 20 53 51 4c 49 54 45  pr(pDflt, SQLITE
3630: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41 46  _UTF8, SQLITE_AF
3640: 46 5f 4e 4f 4e 45 2c 20 26 70 56 61 6c 29 20 29  F_NONE, &pVal) )
3650: 7b 0a 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f  {.      /* mallo
3660: 63 28 29 20 68 61 73 20 66 61 69 6c 65 64 20 2a  c() has failed *
3670: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
3680: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
3690: 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Val ){.      sql
36a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
36b0: 72 73 65 2c 20 22 43 61 6e 6e 6f 74 20 61 64 64  rse, "Cannot add
36c0: 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e   a column with n
36d0: 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 64 65 66 61  on-constant defa
36e0: 75 6c 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ult");.      ret
36f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
3700: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
3710: 70 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pVal);.  }..  /*
3720: 20 4d 6f 64 69 66 79 20 74 68 65 20 43 52 45 41   Modify the CREA
3730: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3740: 6e 74 2e 20 2a 2f 0a 20 20 7a 43 6f 6c 20 3d 20  nt. */.  zCol = 
3750: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
3760: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
3770: 44 65 66 2d 3e 7a 2c 20 70 43 6f 6c 44 65 66 2d  Def->z, pColDef-
3780: 3e 6e 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20  >n);.  if( zCol 
3790: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  ){.    char *zEn
37a0: 64 20 3d 20 26 7a 43 6f 6c 5b 70 43 6f 6c 44 65  d = &zCol[pColDe
37b0: 66 2d 3e 6e 2d 31 5d 3b 0a 20 20 20 20 77 68 69  f->n-1];.    whi
37c0: 6c 65 28 20 28 7a 45 6e 64 3e 7a 43 6f 6c 20 26  le( (zEnd>zCol &
37d0: 26 20 2a 7a 45 6e 64 3d 3d 27 3b 27 29 20 7c 7c  & *zEnd==';') ||
37e0: 20 69 73 73 70 61 63 65 28 2a 28 75 6e 73 69 67   isspace(*(unsig
37f0: 6e 65 64 20 63 68 61 72 20 2a 29 7a 45 6e 64 29  ned char *)zEnd)
3800: 20 29 7b 0a 20 20 20 20 20 20 2a 7a 45 6e 64 2d   ){.      *zEnd-
3810: 2d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a  - = '\0';.    }.
3820: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
3830: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
3840: 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20          "UPDATE 
3850: 25 51 2e 25 73 20 53 45 54 20 22 0a 20 20 20 20  %Q.%s SET ".    
3860: 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73 75 62        "sql = sub
3870: 73 74 72 28 73 71 6c 2c 31 2c 25 64 29 20 7c 7c  str(sql,1,%d) ||
3880: 20 27 2c 20 27 20 7c 7c 20 25 51 20 7c 7c 20 73   ', ' || %Q || s
3890: 75 62 73 74 72 28 73 71 6c 2c 25 64 2c 6c 65 6e  ubstr(sql,%d,len
38a0: 67 74 68 28 73 71 6c 29 29 20 22 0a 20 20 20 20  gth(sql)) ".    
38b0: 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65 20      "WHERE type 
38c0: 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  = 'table' AND na
38d0: 6d 65 20 3d 20 25 51 22 2c 20 0a 20 20 20 20 20  me = %Q", .     
38e0: 20 7a 44 62 2c 20 53 43 48 45 4d 41 5f 54 41 42   zDb, SCHEMA_TAB
38f0: 4c 45 28 69 44 62 29 2c 20 70 4e 65 77 2d 3e 61  LE(iDb), pNew->a
3900: 64 64 43 6f 6c 4f 66 66 73 65 74 2c 20 7a 43 6f  ddColOffset, zCo
3910: 6c 2c 20 70 4e 65 77 2d 3e 61 64 64 43 6f 6c 4f  l, pNew->addColO
3920: 66 66 73 65 74 2b 31 2c 0a 20 20 20 20 20 20 7a  ffset+1,.      z
3930: 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  Tab.    );.    s
3940: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
3950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3960: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
3970: 6f 66 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  of the new colum
3980: 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
3990: 73 65 74 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  set the file.  *
39a0: 2a 20 66 6f 72 6d 61 74 20 74 6f 20 32 2e 20 49  * format to 2. I
39b0: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  f the default va
39c0: 6c 75 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63  lue of the new c
39d0: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  olumn is not NUL
39e0: 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  L,.  ** the file
39f0: 20 66 6f 72 6d 61 74 20 62 65 63 6f 6d 65 73 20   format becomes 
3a00: 33 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 76  3..  */.  if( (v
3a10: 3d 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  =sqlite3GetVdbe(
3a20: 70 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20  pParse)) ){.    
3a30: 69 6e 74 20 66 20 3d 20 28 70 44 66 6c 74 3f 33  int f = (pDflt?3
3a40: 3a 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c  :2);..    /* Onl
3a50: 79 20 73 65 74 20 74 68 65 20 66 69 6c 65 20 66  y set the file f
3a60: 6f 72 6d 61 74 20 74 6f 20 24 66 20 69 66 20 69  ormat to $f if i
3a70: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  t is currently l
3a80: 65 73 73 20 74 68 61 6e 20 24 66 2e 20 2a 2f 0a  ess than $f. */.
3a90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3aa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 64 43  ddOp(v, OP_ReadC
3ab0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a  ookie, iDb, 1);.
3ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3ad0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
3ae0: 65 72 2c 20 66 2c 20 30 29 3b 0a 20 20 20 20 73  er, f, 0);.    s
3af0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3b00: 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 73 71 6c  v, OP_Ge, 0, sql
3b10: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3b20: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 73  ddr(v)+3);.    s
3b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3b40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66  v, OP_Integer, f
3b50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3b60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3b70: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
3b80: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   1);.  }..  /* R
3b90: 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61  eload the schema
3ba0: 20 6f 66 20 74 68 65 20 6d 6f 64 69 66 69 65 64   of the modified
3bb0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 72 65 6c   table. */.  rel
3bc0: 6f 61 64 54 61 62 6c 65 53 63 68 65 6d 61 28 70  oadTableSchema(p
3bd0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 54 61  Parse, pTab, pTa
3be0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 0a 2f  b->zName);.}.../
3bf0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3c00: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
3c10: 74 68 65 20 70 61 72 73 65 72 20 61 66 74 65 72  the parser after
3c20: 20 74 68 65 20 74 61 62 6c 65 2d 6e 61 6d 65 20   the table-name 
3c30: 69 6e 0a 2a 2a 20 61 6e 20 22 41 4c 54 45 52 20  in.** an "ALTER 
3c40: 54 41 42 4c 45 20 3c 74 61 62 6c 65 2d 6e 61 6d  TABLE <table-nam
3c50: 65 3e 20 41 44 44 22 20 73 74 61 74 65 6d 65 6e  e> ADD" statemen
3c60: 74 20 69 73 20 70 61 72 73 65 64 2e 20 41 72 67  t is parsed. Arg
3c70: 75 6d 65 6e 74 20 0a 2a 2a 20 70 53 72 63 20 69  ument .** pSrc i
3c80: 73 20 74 68 65 20 66 75 6c 6c 2d 6e 61 6d 65 20  s the full-name 
3c90: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  of the table bei
3ca0: 6e 67 20 61 6c 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ng altered..**.*
3cb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
3cc0: 61 6b 65 73 20 61 20 28 70 61 72 74 69 61 6c 29  akes a (partial)
3cd0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62   copy of the Tab
3ce0: 6c 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  le structure.** 
3cf0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 62 65  for the table be
3d00: 69 6e 67 20 61 6c 74 65 72 65 64 20 61 6e 64 20  ing altered and 
3d10: 73 65 74 73 20 50 61 72 73 65 2e 70 4e 65 77 54  sets Parse.pNewT
3d20: 61 62 6c 65 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  able to point.**
3d30: 20 74 6f 20 69 74 2e 20 52 6f 75 74 69 6e 65 73   to it. Routines
3d40: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
3d50: 61 72 73 65 72 20 61 73 20 74 68 65 20 63 6f 6c  arser as the col
3d60: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a  umn definition.*
3d70: 2a 20 69 73 20 70 61 72 73 65 64 20 28 69 2e 65  * is parsed (i.e
3d80: 2e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  . sqlite3AddColu
3d90: 6d 6e 28 29 29 20 61 64 64 20 74 68 65 20 6e 65  mn()) add the ne
3da0: 77 20 43 6f 6c 75 6d 6e 20 64 61 74 61 20 74 6f  w Column data to
3db0: 20 0a 2a 2a 20 74 68 65 20 63 6f 70 79 2e 20 54   .** the copy. T
3dc0: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 54  he copy of the T
3dd0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
3de0: 73 20 64 65 6c 65 74 65 64 20 62 79 20 74 6f 6b  s deleted by tok
3df0: 65 6e 69 7a 65 2e 63 20 0a 2a 2a 20 61 66 74 65  enize.c .** afte
3e00: 72 20 70 61 72 73 69 6e 67 20 69 73 20 66 69 6e  r parsing is fin
3e10: 69 73 68 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 6f 75  ished..**.** Rou
3e20: 74 69 6e 65 20 73 71 6c 69 74 65 33 41 6c 74 65  tine sqlite3Alte
3e30: 72 46 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e  rFinishAddColumn
3e40: 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
3e50: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a  d to complete.**
3e60: 20 63 6f 64 69 6e 67 20 74 68 65 20 22 41 4c 54   coding the "ALT
3e70: 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 41 44 44  ER TABLE ... ADD
3e80: 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  " statement..*/.
3e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65  void sqlite3Alte
3ea0: 72 42 65 67 69 6e 41 64 64 43 6f 6c 75 6d 6e 28  rBeginAddColumn(
3eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
3ec0: 72 63 4c 69 73 74 20 2a 70 53 72 63 29 7b 0a 20  rcList *pSrc){. 
3ed0: 20 54 61 62 6c 65 20 2a 70 4e 65 77 3b 0a 20 20   Table *pNew;.  
3ee0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
3ef0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
3f00: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
3f10: 74 20 6e 41 6c 6c 6f 63 3b 0a 0a 20 20 2f 2a 20  t nAlloc;..  /* 
3f20: 4c 6f 6f 6b 20 75 70 20 74 68 65 20 74 61 62 6c  Look up the tabl
3f30: 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  e being altered.
3f40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
3f50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
3f60: 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   );.  pTab = sql
3f70: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
3f80: 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 61 5b  pParse, pSrc->a[
3f90: 30 5d 2e 7a 4e 61 6d 65 2c 20 70 53 72 63 2d 3e  0].zName, pSrc->
3fa0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
3fb0: 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67  .  if( !pTab ) g
3fc0: 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61  oto exit_begin_a
3fd0: 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a  dd_column;..  /*
3fe0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
3ff0: 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65 6d 70  is not an attemp
4000: 74 20 74 6f 20 41 4c 54 45 52 20 61 20 76 69 65  t to ALTER a vie
4010: 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  w. */.  if( pTab
4020: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
4030: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4040: 28 70 50 61 72 73 65 2c 20 22 43 61 6e 6e 6f 74  (pParse, "Cannot
4050: 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20 74 6f   add a column to
4060: 20 61 20 76 69 65 77 22 29 3b 0a 20 20 20 20 67   a view");.    g
4070: 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61  oto exit_begin_a
4080: 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 0a  dd_column;.  }..
4090: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
40a0: 61 64 64 43 6f 6c 4f 66 66 73 65 74 3e 30 20 29  addColOffset>0 )
40b0: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
40c0: 69 44 62 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 61  iDb;..  /* Put a
40d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62   copy of the Tab
40e0: 6c 65 20 73 74 72 75 63 74 20 69 6e 20 50 61 72  le struct in Par
40f0: 73 65 2e 70 4e 65 77 54 61 62 6c 65 20 66 6f 72  se.pNewTable for
4100: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
4110: 33 41 64 64 43 6f 6c 75 6d 6e 28 29 20 66 75 6e  3AddColumn() fun
4120: 63 74 69 6f 6e 20 61 6e 64 20 66 72 69 65 6e 64  ction and friend
4130: 73 20 74 6f 20 6d 6f 64 69 66 79 2e 0a 20 20 2a  s to modify..  *
4140: 2f 0a 20 20 70 4e 65 77 20 3d 20 28 54 61 62 6c  /.  pNew = (Tabl
4150: 65 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e *)sqliteMalloc
4160: 28 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b  (sizeof(Table));
4170: 0a 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 67  .  if( !pNew ) g
4180: 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61  oto exit_begin_a
4190: 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 70 50 61  dd_column;.  pPa
41a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
41b0: 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 6e   pNew;.  pNew->n
41c0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
41d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
41e0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 6e 41  ->nCol>0 );.  nA
41f0: 6c 6c 6f 63 20 3d 20 28 28 28 70 4e 65 77 2d 3e  lloc = (((pNew->
4200: 6e 43 6f 6c 2d 31 29 2f 38 29 2a 38 29 2b 38 3b  nCol-1)/8)*8)+8;
4210: 0a 20 20 61 73 73 65 72 74 28 20 6e 41 6c 6c 6f  .  assert( nAllo
4220: 63 3e 3d 70 4e 65 77 2d 3e 6e 43 6f 6c 20 26 26  c>=pNew->nCol &&
4230: 20 6e 41 6c 6c 6f 63 25 38 3d 3d 30 20 26 26 20   nAlloc%8==0 && 
4240: 6e 41 6c 6c 6f 63 2d 70 4e 65 77 2d 3e 6e 43 6f  nAlloc-pNew->nCo
4250: 6c 3c 38 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 61  l<8 );.  pNew->a
4260: 43 6f 6c 20 3d 20 28 43 6f 6c 75 6d 6e 20 2a 29  Col = (Column *)
4270: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
4280: 65 6f 66 28 43 6f 6c 75 6d 6e 29 2a 6e 41 6c 6c  eof(Column)*nAll
4290: 6f 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61  oc);.  pNew->zNa
42a0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
42b0: 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  p(pTab->zName);.
42c0: 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 61 43 6f    if( !pNew->aCo
42d0: 6c 20 7c 7c 20 21 70 4e 65 77 2d 3e 7a 4e 61 6d  l || !pNew->zNam
42e0: 65 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  e ){.    goto ex
42f0: 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c  it_begin_add_col
4300: 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  umn;.  }.  memcp
4310: 79 28 70 4e 65 77 2d 3e 61 43 6f 6c 2c 20 70 54  y(pNew->aCol, pT
4320: 61 62 2d 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66  ab->aCol, sizeof
4330: 28 43 6f 6c 75 6d 6e 29 2a 70 4e 65 77 2d 3e 6e  (Column)*pNew->n
4340: 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Col);.  for(i=0;
4350: 20 69 3c 70 4e 65 77 2d 3e 6e 43 6f 6c 3b 20 69   i<pNew->nCol; i
4360: 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ++){.    Column 
4370: 2a 70 43 6f 6c 20 3d 20 26 70 4e 65 77 2d 3e 61  *pCol = &pNew->a
4380: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 70 43 6f 6c  Col[i];.    pCol
4390: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
43a0: 53 74 72 44 75 70 28 70 43 6f 6c 2d 3e 7a 4e 61  StrDup(pCol->zNa
43b0: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  me);.    pCol->z
43c0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Type = 0;.    pC
43d0: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 30 3b 0a 20  ol->pDflt = 0;. 
43e0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 44 62 20 3d   }.  pNew->iDb =
43f0: 20 69 44 62 3b 0a 20 20 70 4e 65 77 2d 3e 61 64   iDb;.  pNew->ad
4400: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 70 54 61  dColOffset = pTa
4410: 62 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 3b  b->addColOffset;
4420: 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20  .  pNew->nRef = 
4430: 31 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61  1;..  /* Begin a
4440: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
4450: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
4460: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 2a  chema cookie.  *
4470: 2f 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  /.  sqlite3Begin
4480: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
4490: 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
44a0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
44b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
44c0: 69 66 28 20 21 76 20 29 20 67 6f 74 6f 20 65 78  if( !v ) goto ex
44d0: 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c  it_begin_add_col
44e0: 75 6d 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 68  umn;.  sqlite3Ch
44f0: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
4500: 65 2d 3e 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  e->db, v, iDb);.
4510: 0a 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f  .exit_begin_add_
4520: 63 6f 6c 75 6d 6e 3a 0a 20 20 73 71 6c 69 74 65  column:.  sqlite
4530: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
4540: 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  Src);.  return;.
4550: 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  }.#endif  /* SQL
4560: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
4570: 2a 2f 0a 0a 7d 0a                                */..}.