001/*
002 * ModeShape (http://www.modeshape.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *       http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.modeshape.sequencer.ddl.dialect.mysql;
017
018import java.util.Arrays;
019import java.util.List;
020import org.modeshape.sequencer.ddl.DdlConstants;
021
022/**
023 * @author blafond
024 */
025public interface MySqlDdlConstants extends DdlConstants {
026    public static final String[] CUSTOM_KEYWORDS = {"DATABASE", "DEFINER", "EVENT", "LOGFILE", "TABLESPACE", "TRIGGER",
027        "TINYINT", "MEDIUMINT", "BIGINT", "FIXED", "BOOL", "BOOLEAN", "BINARY", "VARBINARY", "TINYBLOB", "TINYTEXT",
028        "MEDIUMBLOB", "MEDIUMTEXT", "LONGBLOB", "LONGTEXT", "TEXT", "ENUM", "SET", "DATETIME", "YEAR", "BLOB", "RENAME",
029        "ALGORITHM", "SECURITY"};
030
031    static final String[] STMT_ALTER_ALGORITHM = {"ALTER", "ALGORITHM"};
032    static final String[] STMT_ALTER_DATABASE = {"ALTER", "DATABASE"};
033    static final String[] STMT_ALTER_DEFINER = {"ALTER", "DEFINER"}; // = ALTER EVENT, ALTER VIEW
034    static final String[] STMT_ALTER_EVENT = {"ALTER", "EVENT"};
035    static final String[] STMT_ALTER_FUNCTION = {"ALTER", "FUNCTION"};
036    static final String[] STMT_ALTER_LOGFILE_GROUP = {"ALTER", "LOGFILE", "GROUP"};
037    static final String[] STMT_ALTER_PROCEDURE = {"ALTER", "PROCEDURE"};
038    static final String[] STMT_ALTER_SCHEMA = {"ALTER", "SCHEMA"};
039    static final String[] STMT_ALTER_SERVER = {"ALTER", "SERVER"};
040    static final String[] STMT_ALTER_SQL_SECURITY = {"ALTER", "SQL", "SECURITY"};
041    static final String[] STMT_ALTER_TABLESPACE = {"ALTER", "TABLESPACE"};
042
043    // ALTER [ONLINE | OFFLINE] [IGNORE] TABLE
044    static final String[] STMT_ALTER_IGNORE_TABLE = {"ALTER", "IGNORE", "TABLE"};
045    static final String[] STMT_ALTER_ONLINE_TABLE = {"ALTER", "ONLINE", "TABLE"};
046    static final String[] STMT_ALTER_OFFLINE_TABLE = {"ALTER", "OFFLINE", "TABLE"};
047    static final String[] STMT_ALTER_ONLINE_IGNORE_TABLE = {"ALTER", "ONLINE", "IGNORE", "TABLE"};
048    static final String[] STMT_ALTER_OFFLINE_IGNORE_TABLE = {"ALTER", "OFFLINE", "IGNORE", "TABLE"};
049
050    interface MySqlStatementStartPhrases {
051        static final String[][] ALTER_PHRASES = {STMT_ALTER_DATABASE, STMT_ALTER_DEFINER, STMT_ALTER_EVENT, STMT_ALTER_FUNCTION,
052            STMT_ALTER_LOGFILE_GROUP, STMT_ALTER_PROCEDURE, STMT_ALTER_SCHEMA, STMT_ALTER_SERVER, STMT_ALTER_TABLESPACE,
053            STMT_ALTER_IGNORE_TABLE, STMT_ALTER_ONLINE_TABLE, STMT_ALTER_OFFLINE_TABLE, STMT_ALTER_ONLINE_IGNORE_TABLE,
054            STMT_ALTER_OFFLINE_IGNORE_TABLE};
055
056        static final String[] STMT_CREATE_DATABASE = {"CREATE", "DATABASE"};
057        static final String[] STMT_CREATE_DEFINER = {"CREATE", "DEFINER"}; // TRIGGER, FUNCTION, PROCEDURE, EVENT
058        static final String[] STMT_CREATE_EVENT = {"CREATE", "EVENT"};
059        static final String[] STMT_CREATE_FUNCTION = {"CREATE", "FUNCTION"};
060        static final String[] STMT_CREATE_INDEX = {"CREATE", "INDEX"};
061        static final String[] STMT_CREATE_LOGFILE_GROUP = {"CREATE", "LOGFILE", "GROUP"};
062        static final String[] STMT_CREATE_UNIQUE_INDEX = {"CREATE", "UNIQUE", "INDEX"};
063        static final String[] STMT_CREATE_PROCEDURE = {"CREATE", "PROCEDURE"};
064        static final String[] STMT_CREATE_SERVER = {"CREATE", "SERVER"};
065        static final String[] STMT_CREATE_TABLESPACE = {"CREATE", "TABLESPACE"};
066        static final String[] STMT_CREATE_TRIGGER = {"CREATE", "TRIGGER"};
067
068        static final String[][] CREATE_PHRASES = {STMT_CREATE_DATABASE, STMT_CREATE_DEFINER, STMT_CREATE_EVENT,
069            STMT_CREATE_FUNCTION, STMT_CREATE_INDEX, STMT_CREATE_LOGFILE_GROUP, STMT_CREATE_UNIQUE_INDEX, STMT_CREATE_PROCEDURE,
070            STMT_CREATE_SERVER, STMT_CREATE_TABLESPACE, STMT_CREATE_TRIGGER};
071
072        /*
073         * TODO:  WORK REQUIRED HERE
074         * 
075         * NOTE:  The CREATE VIEW syntax for MySQL is convoluted as shown below. Basically you have to check for multiple properties
076         * BEFORE the actual "VIEW view_name (...) AS ...." is defined.
077         * Will make it difficult to parse cleanly.
078         * 
079         * THIS ALSO affects ALTER VIEW
080         * 
081            CREATE
082                    [OR REPLACE]
083                    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
084                    [DEFINER = { user | CURRENT_USER }]
085                    [SQL SECURITY { DEFINER | INVOKER }]
086                    VIEW view_name [(column_list)]
087                    AS select_statement
088                    [WITH [CASCADED | LOCAL] CHECK OPTION]
089         * 
090         * 
091         */
092
093        static final String[] STMT_DROP_DATABASE = {"DROP", "DATABASE"};
094        static final String[] STMT_DROP_EVENT = {"DROP", "EVENT"};
095        static final String[] STMT_DROP_FUNCTION = {"DROP", "FUNCTION"};
096        static final String[] STMT_DROP_INDEX = {"DROP", "INDEX"};
097        static final String[] STMT_DROP_ONLINE_INDEX = {"DROP", "ONLINE", "INDEX"};
098        static final String[] STMT_DROP_OFFLINE_INDEX = {"DROP", "OFFLINE", "INDEX"};
099        static final String[] STMT_DROP_LOGFILE_GROUP = {"DROP", "LOGFILE", "GROUP"};
100        static final String[] STMT_DROP_PROCEDURE = {"DROP", "PROCEDURE"};
101        static final String[] STMT_DROP_SERVER = {"DROP", "SERVER"};
102        static final String[] STMT_DROP_TABLESPACE = {"DROP", "TABLESPACE"};
103        static final String[] STMT_DROP_TRIGGER = {"DROP", "TRIGGER"};
104
105        static final String[][] DROP_PHRASES = {STMT_DROP_DATABASE, STMT_DROP_EVENT, STMT_DROP_FUNCTION, STMT_DROP_INDEX,
106            STMT_DROP_ONLINE_INDEX, STMT_DROP_OFFLINE_INDEX, STMT_DROP_LOGFILE_GROUP, STMT_DROP_PROCEDURE, STMT_DROP_SERVER,
107            STMT_DROP_TABLESPACE, STMT_DROP_TRIGGER};
108        static final String[][] SET_PHRASES = {
109
110        };
111
112        // RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
113        static final String[] STMT_RENAME_DATABASE = {"RENAME", "DATABASE"};
114        static final String[] STMT_RENAME_SCHEMA = {"RENAME", "SCHEMA"};
115        // RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...
116        static final String[] STMT_RENAME_TABLE = {"RENAME", "TABLE"};
117
118        static final String[][] MISC_PHRASES = {STMT_RENAME_DATABASE, STMT_RENAME_SCHEMA, STMT_RENAME_TABLE};
119    }
120
121    static final String[] DTYPE_NATIONAL_VARCHAR = {"NATIONAL", "VARCHAR"};// BOOLEAN
122
123    static final String[] DTYPE_TINYINT = {"TINYINT"}; // TINYINT[(M)] [UNSIGNED] [ZEROFILL]
124    static final String[] DTYPE_MEDIUMINT = {"MEDIUMINT"}; // MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
125    static final String[] DTYPE_BIGINT = {"BIGINT"}; // BIGINT[(M)] [UNSIGNED] [ZEROFILL]
126    static final String[] DTYPE_FIXED = {"FIXED"};// FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
127    static final String[] DTYPE_BOOL = {"BOOL"};// BOOL
128    static final String[] DTYPE_BOOLEAN = {"BOOLEAN"};// BOOLEAN
129
130    static final String[] DTYPE_DOUBLE = {"DOUBLE"}; // DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
131
132    static final String[] DTYPE_BINARY = {"BINARY"};
133    static final String[] DTYPE_VARBINARY = {"VARBINARY"};
134    static final String[] DTYPE_BLOB = {"BLOB"};
135    static final String[] DTYPE_TINYBLOB = {"TINYBLOB"};
136    static final String[] DTYPE_TINYTEXT = {"TINYTEXT"};
137    static final String[] DTYPE_TEXT = {"TEXT"};
138    static final String[] DTYPE_MEDIUMBLOB = {"MEDIUMBLOB"};
139    static final String[] DTYPE_MEDIUMTEXT = {"MEDIUMTEXT"};
140    static final String[] DTYPE_LONGBLOB = {"LONGBLOB"};
141    static final String[] DTYPE_LONGTEXT = {"LONGTEXT"};
142    static final String[] DTYPE_ENUM = {"ENUM"};
143    static final String[] DTYPE_SET = {"SET"};
144
145    static final String[] DTYPE_DATETIME = {"DATETIME"};
146    static final String[] DTYPE_YEAR = {"YEAR"};
147
148    interface MySqlDataTypes {
149        static final List<String[]> CUSTOM_DATATYPE_START_PHRASES = Arrays.asList(new String[][] {DTYPE_BIGINT, DTYPE_BOOL,
150            DTYPE_BOOLEAN, DTYPE_FIXED, DTYPE_DOUBLE, DTYPE_MEDIUMINT, DTYPE_TINYINT, DTYPE_NATIONAL_VARCHAR, DTYPE_BINARY,
151            DTYPE_VARBINARY, DTYPE_TINYBLOB, DTYPE_TINYTEXT, DTYPE_TEXT, DTYPE_MEDIUMBLOB, DTYPE_MEDIUMTEXT, DTYPE_LONGBLOB,
152            DTYPE_LONGTEXT, DTYPE_ENUM, DTYPE_SET, DTYPE_DATETIME, DTYPE_YEAR, DTYPE_BLOB});
153
154        static final List<String> CUSTOM_DATATYPE_START_WORDS = Arrays.asList(new String[] {"TINYINT", "MEDIUMINT", "BIGINT",
155            "FIXED", "BOOL", "BOOLEAN", "BINARY", "VARBINARY", "TINYBLOB", "TINYTEXT", "MEDIUMBLOB", "MEDIUMTEXT", "LONGBLOB",
156            "LONGTEXT", "TEXT", "ENUM", "SET", "DATETIME", "YEAR", "BLOB"});
157        /* 
158         * ===========================================================================================================================
159         * DATATYPES
160
161                data_type:
162                    BIT[(length)]
163                  | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
164                  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
165                  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
166                  | INT[(length)] [UNSIGNED] [ZEROFILL]
167                  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
168                  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
169                  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
170                  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
171                  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
172                  | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
173                  | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
174                  | DATE
175                  | TIME
176                  | TIMESTAMP
177                  | DATETIME
178                  | YEAR
179                  | CHAR[(length)]
180                      [CHARACTER SET charset_name] [COLLATE collation_name]
181                  | VARCHAR(length)
182                      [CHARACTER SET charset_name] [COLLATE collation_name]
183                  | BINARY[(length)]
184                  | VARBINARY(length)
185                  | TINYBLOB
186                  | BLOB
187                  | MEDIUMBLOB
188                  | LONGBLOB
189                  | TINYTEXT [BINARY]
190                      [CHARACTER SET charset_name] [COLLATE collation_name]
191                  | TEXT [BINARY]
192                      [CHARACTER SET charset_name] [COLLATE collation_name]
193                  | MEDIUMTEXT [BINARY]
194                      [CHARACTER SET charset_name] [COLLATE collation_name]
195                  | LONGTEXT [BINARY]
196                      [CHARACTER SET charset_name] [COLLATE collation_name]
197                  | ENUM(value1,value2,value3,...)
198                      [CHARACTER SET charset_name] [COLLATE collation_name]
199                  | SET(value1,value2,value3,...)
200                      [CHARACTER SET charset_name] [COLLATE collation_name]
201                  | spatial_type
202
203
204             * 
205             */
206    }
207}