未验证 提交 efe51bb4 编写于 作者: ShardingSphere's avatar ShardingSphere 提交者: GitHub

Merge pull request #1330 from ma-xiao-guang-64/sharding-jdbc-ddl-parser

Sharding jdbc ddl parser(add test case for postgre)
......@@ -4,5 +4,5 @@ import MySQLKeyword, Keyword, MySQLBase, BaseRule, Symbol;
createIndex:
CREATE (UNIQUE | FULLTEXT | SPATIAL)? INDEX indexName
indexType?
ON tableName keyPartsWithParen
ON tableName
;
\ No newline at end of file
......@@ -3,12 +3,12 @@ grammar PostgreAlterTable;
import PostgreKeyword, DataType, Keyword, PostgreBase, BaseRule, Symbol;
alterTable
: alterTableNameWithAsterisk(alterTableActions| renameColumn | renameConstraint)
: alterTableNameWithAsterisk (alterTableActions| renameColumn | renameConstraint)
| alterTableNameExists renameTable
;
alterTableNameWithAsterisk
: alterTableOp (IF EXISTS)? ONLY? tableName ASTERISK?
: ALTER TABLE (IF EXISTS)? ONLY? tableName ASTERISK?
;
alterTableOp
......
......@@ -107,7 +107,20 @@ tableConstraintOption
: checkOption
| UNIQUE columnList indexParameters
| primaryKey columnList indexParameters
| FOREIGN KEY columnList REFERENCES tableName columnList
| FOREIGN KEY columnList REFERENCES tableName columnList (MATCH FULL | MATCH PARTIAL | MATCH SIMPLE)? foreignKeyOnAction*
;
foreignKeyOnAction
: ON UPDATE foreignKeyOn
| ON DELETE foreignKeyOn
;
foreignKeyOn
: RESTRICT
| CASCADE
| SET NULL
| NO ACTION
| SET DEFAULT
;
excludeElement
......
......@@ -29,8 +29,4 @@ likeOption
inheritClause
: INHERITS LEFT_PAREN tableName (COMMA tableName)* RIGHT_PAREN
;
partitionOfParent
: PARTITION OF tableName
;
\ No newline at end of file
......@@ -17,10 +17,14 @@
package io.shardingsphere.core.parsing.antler.mysql.ddl;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.parser.antlr.MySQLStatementLexer;
import io.shardingsphere.parser.antlr.MySQLStatementParser;
import io.shardingsphere.parser.antlr.PostgreStatementLexer;
import io.shardingsphere.parser.antlr.PostgreStatementParser;
import io.shardingsphere.test.sql.SQLCaseType;
import io.shardingsphere.test.sql.SQLCasesLoader;
import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CodePointCharStream;
......@@ -31,13 +35,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import io.shardingsphere.core.constant.DatabaseType;
import io.shardingsphere.core.parsing.antler.parser.MySQLStatementAdvancedParser;
import io.shardingsphere.parser.antlr.MySQLStatementLexer;
import io.shardingsphere.parser.antlr.MySQLStatementParser;
import io.shardingsphere.test.sql.SQLCaseType;
import io.shardingsphere.test.sql.SQLCasesLoader;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@RunWith(Parameterized.class)
@RequiredArgsConstructor
......@@ -61,19 +61,26 @@ public final class IntegrateAntlrSupportedSQLParsingTest {
CodePointCharStream cs = CharStreams.fromString(sqlCasesLoader.getAntlrSupportedSQL(sqlCaseId, sqlCaseType, Collections.emptyList()));
switch (databaseType) {
case MySQL:
MySQLStatementLexer lexer = new MySQLStatementLexer(cs);
CommonTokenStream tokens = new CommonTokenStream(lexer);
MySQLStatementParser parser = new MySQLStatementAdvancedParser(tokens);
parser.addErrorListener(new BaseErrorListener() {
MySQLStatementLexer mysqlStatementLexer = new MySQLStatementLexer(cs);
MySQLStatementParser mysqlStatementParser = new MySQLStatementParser(new CommonTokenStream(mysqlStatementLexer));
mysqlStatementParser.addErrorListener(new BaseErrorListener() {
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
throw new RuntimeException();
}
});
parser.execute();
mysqlStatementParser.execute();
break;
case Oracle:
break;
case PostgreSQL:
PostgreStatementLexer postgreStatementLexer = new PostgreStatementLexer(cs);
PostgreStatementParser postgreStatementParser = new PostgreStatementParser(new CommonTokenStream(postgreStatementLexer));
postgreStatementParser.addErrorListener(new BaseErrorListener() {
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
throw new RuntimeException();
}
});
postgreStatementParser.execute();
break;
case SQLServer:
break;
......
<?xml version="1.0" encoding="UTF-8"?>
<sql-cases>
<sql-case id="alter_table_add_column" value="ALTER TABLE t_log ADD COLUMN column1 varchar(10) AFTER status" db-types="MySQL" />
<sql-case id="alter_table_add_columns" value="ALTER TABLE t_log ADD COLUMN (column2 varchar(10) NOT NULL, column3 geometry NOT NULL)" db-types="MySQL" />
<sql-case id="alter_table_add_index" value="ALTER TABLE t_log ADD INDEX t_log_index (column1(10) DESC) USING BTREE" db-types="MySQL" />
<sql-case id="alter_table_add_fulltext_index" value="ALTER TABLE t_log ADD FULLTEXT INDEX t_log_fulltext_index (column2)" db-types="MySQL" />
<sql-case id="alter_table_add_spatial_index" value="ALTER TABLE t_log ADD SPATIAL INDEX t_log_spatial_index (column3)" db-types="MySQL" />
<sql-case id="alter_table_add_column" value="ALTER TABLE t_log ADD COLUMN column1 varchar(10)" db-types="MySQL,PostgreSQL" />
<sql-case id="alter_table_add_column_with_back_quota" value="ALTER TABLE `t_log` ADD COLUMN `column1` varchar(10)" db-types="MySQL,PostgreSQL" />
<sql-case id="alter_table_add_column_if_not_exists" value="ALTER TABLE t_log ADD COLUMN IF NOT EXISTS column1 varchar(10)" db-types="PostgreSQL" />
<sql-case id="alter_table_add_column_mysql_column_option" value="ALTER TABLE `t_log` ADD COLUMN `column1` varchar(10) NOT NULL COMMENT 'column1'" db-types="MySQL" />
<sql-case id="alter_table_add_column_with_after" value="ALTER TABLE t_log ADD COLUMN column1 varchar(10) AFTER status" db-types="MySQL" />
<sql-case id="alter_table_add_columns" value="ALTER TABLE t_log ADD COLUMN (column1 varchar(10), column2 geometry)" db-types="MySQL" />
<sql-case id="alter_table_add_primary_key" value="ALTER TABLE t_log ADD CONSTRAINT PRIMARY KEY (id)" db-types="MySQL" />
<sql-case id="alter_table_add_unique_key" value="ALTER TABLE t_log ADD CONSTRAINT UNIQUE KEY t_log_unique_key (id)" db-types="MySQL" />
<sql-case id="alter_table_add_foreign_key" value="ALTER TABLE t_order_item ADD CONSTRAINT FOREIGN KEY t_order_item_foreign_key (order_id) REFERENCES t_order (order_id) ON UPDATE CASCADE ON UPDATE CASCADE" db-types="MySQL" />
<sql-case id="alter_table_add_primary_key" value="ALTER TABLE t_order_item ADD PRIMARY KEY(id)" db-types="PostgreSQL" />
<sql-case id="alter_table_add_unique_key" value="ALTER TABLE t_log ADD CONSTRAINT UNIQUE KEY uk_id (id)" db-types="MySQL" />
<sql-case id="alter_table_add_unique_key" value="ALTER TABLE t_order_item ADD UNIQUE(id)" db-types="PostgreSQL" />
<sql-case id="alter_table_add_foreign_key" value="ALTER TABLE t_order_item ADD CONSTRAINT FOREIGN KEY fk_order_id (order_id) REFERENCES t_order (order_id) ON UPDATE CASCADE ON UPDATE CASCADE" db-types="MySQL" />
<sql-case id="alter_table_add_foreign_key" value="ALTER TABLE t_order_item ADD FOREIGN KEY (order_id) REFERENCES t_order (order_id) ON UPDATE CASCADE ON UPDATE CASCADE" db-types="PostgreSQL" />
<sql-case id="alter_table_add_index" value="ALTER TABLE t_log ADD INDEX idx_id (id)" db-types="MySQL" />
<sql-case id="alter_table_add_index_with_index_option" value="ALTER TABLE t_log ADD INDEX idx_id (id) USING BTREE COMMENT 'idx_id'" db-types="MySQL" />
<sql-case id="alter_table_add_fulltext_index" value="ALTER TABLE t_log ADD FULLTEXT INDEX idx_column1 (column1)" db-types="MySQL" />
<sql-case id="alter_table_add_spatial_index" value="ALTER TABLE t_log ADD SPATIAL INDEX idx_column2 (column2)" db-types="MySQL" />
<sql-case id="alter_table_alter_column" value="ALTER TABLE t_log ALTER COLUMN column1 TYPE varchar(20)" db-types="PostgreSQL" />
<sql-case id="alter_table_modify_column" value="ALTER TABLE t_log MODIFY COLUMN column1 varchar(10) NOT NULL" db-types="MySQL" />
<sql-case id="alter_table_change_column" value="ALTER TABLE t_log CHANGE COLUMN column1 column1 varchar(10) NOT NULL" db-types="MySQL" />
<sql-case id="alter_table_rename_index" value="ALTER TABLE t_log RENAME INDEX t_log_index TO t_log_index" db-types="MySQL" />
<sql-case id="alter_table_drop_index" value="ALTER TABLE t_log DROP INDEX t_log_index" db-types="MySQL" />
<sql-case id="alter_table_drop_column" value="ALTER TABLE t_log DROP COLUMN column1" db-types="MySQL" />
<sql-case id="alter_table_rename_index" value="ALTER TABLE t_log RENAME INDEX idx_id TO idx_id" db-types="MySQL" />
<sql-case id="alter_table_drop_column" value="ALTER TABLE t_log DROP COLUMN column1" db-types="MySQL,PostgreSQL" />
<sql-case id="alter_table_drop_column_if_exists" value="ALTER TABLE t_log DROP COLUMN IF EXISTS column1" db-types="PostgreSQL" />
<sql-case id="alter_table_drop_primary_key" value="ALTER TABLE t_log DROP PRIMARY KEY" db-types="MySQL" />
<sql-case id="alter_table_drop_foreign_key" value="ALTER TABLE t_order_item DROP FOREIGN KEY t_order_item_foreign_key" db-types="MySQL" />
<sql-case id="alter_table_drop_foreign_key" value="ALTER TABLE t_order_item DROP FOREIGN KEY fk_order_id" db-types="MySQL" />
<sql-case id="alter_table_drop_constraint" value="ALTER TABLE t_order_item DROP CONSTRAINT idx_id" db-types="PostgreSQL" />
<sql-case id="alter_table_drop_constraint_if_exists" value="ALTER TABLE t_order_item DROP CONSTRAINT IF EXISTS idx_id" db-types="PostgreSQL" />
<sql-case id="alter_table_drop_index" value="ALTER TABLE t_log DROP INDEX idx_id" db-types="MySQL" />
<sql-case id="alter_index_rename" value="ALTER INDEX idx_id RENAME TO idx_id" db-types="PostgreSQL" />
<sql-case id="alter_index_rename_if_exists" value="ALTER INDEX IF EXISTS idx_id RENAME TO idx_id" db-types="PostgreSQL" />
</sql-cases>
<?xml version="1.0" encoding="UTF-8"?>
<sql-cases>
<sql-case id="create_table" value="CREATE TABLE t_log(id int PRIMARY KEY, status varchar(10))" db-types="MySQL" />
<sql-case id="create_table_if_not_exists" value="CREATE TABLE IF NOT EXISTS t_log(id int PRIMARY KEY, status varchar(10))" db-types="MySQL" />
<sql-case id="create_temporary_table" value="CREATE TEMPORARY TABLE t_log(id int PRIMARY KEY, status varchar(10))" db-types="MySQL" />
<sql-case id="create_table" value="CREATE TABLE t_log (id int, status varchar(10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_back_quota" value="CREATE TABLE `t_log` (`id` int, `status` varchar(10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_mysql_column_option" value="CREATE TABLE t_log (id int NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'id', status varchar(10))" db-types="MySQL" />
<sql-case id="create_table_with_postgre_column_option" value="CREATE TABLE t_log (id int NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, status varchar(10))" db-types="PostgreSQL" />
<sql-case id="create_temporary_table" value="CREATE TEMPORARY TABLE t_log(id int, status varchar(10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_local_temp_table" value="CREATE LOCAL TEMP TABLE t_log (id int, status varchar(10))" db-types="PostgreSQL" />
<sql-case id="create_unlogged_table" value="CREATE UNLOGGED TABLE t_log (id int, status varchar(10))" db-types="PostgreSQL" />
<sql-case id="create_table_if_not_exists" value="CREATE TABLE IF NOT EXISTS t_log (id int, status varchar(10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_primary_key" value="CREATE TABLE t_log (id int, status varchar(10), PRIMARY KEY(id))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_unique_key" value="CREATE TABLE t_log (id int, status varchar(10), UNIQUE(id))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_unique_key" value="CREATE TABLE t_log (id int, status varchar(10), UNIQUE(id))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_foreign_key" value="CREATE TABLE t_order_item (order_item_id int, order_id int, user_id int, FOREIGN KEY (order_id) REFERENCES t_order (order_id) ON UPDATE CASCADE ON UPDATE CASCADE)" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_with_composite_index" value="CREATE TABLE t_log (id int, status varchar(10), INDEX(id, status(10)))" db-types="MySQL" />
<sql-case id="create_table_with_fulltext_index" value="CREATE TABLE t_log (id int, status varchar(10), FULLTEXT INDEX (column1))" db-types="MySQL" />
<sql-case id="create_table_with_spatial_index" value="CREATE TABLE t_log (id int, status varchar(10), SPATIAL INDEX (column2))" db-types="MySQL" />
<sql-case id="create_table_with_check" value="CREATE TABLE t_log (id int PRIMARY KEY, status varchar(10), check(id > 10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_select" value="CREATE TABLE t_log_bak_1 AS SELECT * FROM t_log" db-types="MySQL" />
<sql-case id="create_table_like" value="CREATE TABLE t_log_bak_2 (LIKE t_log)" db-types="MySQL" />
<sql-case id="create_index" value="CREATE INDEX t_log_index USING BTREE ON t_log (id)" db-types="MySQL" />
<sql-case id="create_composite_index" value="CREATE INDEX t_log_index ON t_log (id, status(10))" db-types="MySQL" />
<sql-case id="create_unique_index" value="CREATE UNIQUE INDEX t_log_unique_index ON t_log (id)" db-types="MySQL" />
<sql-case id="create_unique_index" value="CREATE FULLTEXT INDEX t_log_fulltext_index ON t_log (column2)" db-types="MySQL" />
<sql-case id="create_unique_index" value="CREATE SPATIAL INDEX t_log_spatial_index ON t_log (column3)" db-types="MySQL" />
<sql-case id="create_table_like" value="CREATE TABLE t_log_bak_2 (LIKE t_log)" db-types="MySQL,PostgreSQL" />
<sql-case id="create_table_inherits" value="CREATE TABLE t_log_bak_3() inherits (t_log)" db-types="PostgreSQL" />
<sql-case id="create_index" value="CREATE INDEX idx_id ON t_log (id)" db-types="MySQL,PostgreSQL" />
<sql-case id="create_index_with_back_quota" value="CREATE INDEX `idx_id` ON `t_log` (`id`)" db-types="MySQL,PostgreSQL" />
<sql-case id="create_index_concurrently" value="CREATE INDEX CONCURRENTLY idx_id ON t_log (id)" db-types="PostgreSQL" />
<sql-case id="create_index_if_not_exists" value="CREATE INDEX IF NOT EXISTS idx_id ON t_log (id)" db-types="PostgreSQL" />
<sql-case id="create_index_with_type" value="CREATE INDEX idx_id USING BTREE ON t_log (id)" db-types="MySQL" />
<sql-case id="create_composite_index" value="CREATE INDEX idx_id_status ON t_log (id, status(10))" db-types="MySQL,PostgreSQL" />
<sql-case id="create_unique_index" value="CREATE UNIQUE INDEX uk_id ON t_log (id)" db-types="MySQL,PostgreSQL" />
<sql-case id="create_fulltext_index" value="CREATE FULLTEXT INDEX idx_column1 ON t_log (column1)" db-types="MySQL" />
<sql-case id="create_spatial_index" value="CREATE SPATIAL INDEX idx_column2 ON t_log (column2)" db-types="MySQL" />
</sql-cases>
<?xml version="1.0" encoding="UTF-8"?>
<sql-cases>
<sql-case id="drop_table" value="DROP TABLE t_log" db-types="MySQL" />
<sql-case id="drop_table_if_exists" value="DROP TABLE IF EXISTS t_log" db-types="MySQL" />
<sql-case id="drop_table" value="DROP TABLE t_log" db-types="MySQL,PostgreSQL" />
<sql-case id="drop_table_with_back_quota" value="DROP TABLE `t_log`" db-types="MySQL,PostgreSQL" />
<sql-case id="drop_tables" value="DROP TABLE t_log1, t_log2" db-types="MySQL,PostgreSQL" />
<sql-case id="drop_table_if_exists" value="DROP TABLE IF EXISTS t_log" db-types="MySQL,PostgreSQL" />
<sql-case id="drop_temporary_table" value="DROP TEMPORARY TABLE t_temp_log" db-types="MySQL" />
<sql-case id="drop_index" value="DROP INDEX t_log_index ON t_log" db-types="MySQL" />
<sql-case id="drop_index_offline" value="DROP INDEX OFFLINE t_log_index ON t_log" db-types="MySQL" />
<sql-case id="drop_index" value="DROP INDEX idx_id ON t_log" db-types="MySQL,PostgreSQL" />
<sql-case id="drop_index_concurrently" value="DROP INDEX CONCURRENTLY idx_id ON t_log" db-types="PostgreSQL" />
<sql-case id="drop_index_if_exists" value="DROP INDEX IF EXISTS idx_id ON t_log" db-types="PostgreSQL" />
<sql-case id="drop_index_offline" value="DROP INDEX OFFLINE idx_id ON t_log" db-types="MySQL" />
</sql-cases>
<?xml version="1.0" encoding="UTF-8"?>
<sql-cases>
<sql-case id="truncate_table" value="TRUNCATE TABLE t_log" db-types="MySQL" />
<sql-case id="truncate_table_simple" value="TRUNCATE t_log" db-types="MySQL" />
<sql-case id="truncate_table" value="TRUNCATE TABLE t_log" db-types="MySQL,PostgreSQL" />
<sql-case id="truncate_table_with_back_quota" value="TRUNCATE TABLE `t_log`" db-types="MySQL,PostgreSQL" />
<sql-case id="truncate_tables" value="TRUNCATE TABLE t_log1, t_log2" db-types="PostgreSQL" />
<sql-case id="truncate_table_with_asterish" value="TRUNCATE TABLE t_log *" db-types="PostgreSQL" />
<sql-case id="truncate_table_only" value="TRUNCATE TABLE ONLY t_log" db-types="PostgreSQL" />
<sql-case id="truncate_table_simple" value="TRUNCATE t_log" db-types="MySQL,PostgreSQL" />
</sql-cases>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册