Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mysql 8 check DDL语法无法正常识别 #4089

Open
WillsonYip opened this issue Dec 14, 2020 · 1 comment
Open

Mysql 8 check DDL语法无法正常识别 #4089

WillsonYip opened this issue Dec 14, 2020 · 1 comment

Comments

@WillsonYip
Copy link
Contributor

WillsonYip commented Dec 14, 2020

#4082

环境:mysql 8.0.22 , druid 1.2.4

经过#4082修复之后,现在能识别/*!80016 NOT ENFORCED */ ,druid解释并格式化出来的SQL:

CREATE TABLE `t12` (
	`c1` int DEFAULT NULL,
	`c2` int DEFAULT NULL,
	`c3` int DEFAULT NULL,
	CONSTRAINT `c12_positive` CHECK (`c2` > 0) NOT ENFORCED,
	CONSTRAINT `c21_nonzero` CHECK (`c1` <> 0),
	CONSTRAINT `t12_chk_1` CHECK (`c1` <> `c2`),
	CONSTRAINT `t12_chk_2` CHECK (`c1` > 10),
	CONSTRAINT `t12_chk_3` CHECK (`c3` < 100),
	CONSTRAINT `t12_chk_4` CHECK (`c1` > `c3`)
) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

这条SQL mysql能正常识别,但用druid 1.2.4 去解释,依然有问题:

测试代码:

public static void main(String[] args) {
        String sql ="CREATE TABLE `t12` (\n" +
                "\t`c1` int DEFAULT NULL,\n" +
                "\t`c2` int DEFAULT NULL,\n" +
                "\t`c3` int DEFAULT NULL,\n" +
                "\tCONSTRAINT `c12_positive` CHECK (`c2` > 0) NOT ENFORCED,\n" +
                "\tCONSTRAINT `c21_nonzero` CHECK (`c1` <> 0),\n" +
                "\tCONSTRAINT `t12_chk_1` CHECK (`c1` <> `c2`),\n" +
                "\tCONSTRAINT `t12_chk_2` CHECK (`c1` > 10),\n" +
                "\tCONSTRAINT `t12_chk_3` CHECK (`c3` < 100),\n" +
                "\tCONSTRAINT `t12_chk_4` CHECK (`c1` > `c3`)\n" +
                ") ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;";
        MySqlStatementParser parser = new MySqlStatementParser(sql);
        SQLStatement createTableStatement =  parser.parseStatement();
        System.out.println(createTableStatement);
    }

控制台打印的信息:

Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'(`c2` > 0) NOT ENFORCED,
	CONSTRAINT `c21_non', expect ), actual null, pos 149, line 5, column 50, token IDENTIFIER ENFORCED
	at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:558)
	at com.alibaba.druid.sql.parser.SQLParser.accept(SQLParser.java:566)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlCreateTableParser.parseCreateTable(MySqlCreateTableParser.java:362)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:301)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:249)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatement(SQLStatementParser.java:4469)
@WillsonYip
Copy link
Contributor Author

WillsonYip commented Dec 16, 2020

check 相关的还有其他语句:

# 新增check 约束
ALTER TABLE t1 ADD CONSTRAINT chk1 CHECK((a>1));
ALTER TABLE t1 ADD CONSTRAINT chk1 CHECK((a>1)) NOT ENFORCED; 

# 删除check 约束
ALTER TABLE t1 DROP CONSTRAINT t1_check ;

# 让check约束不生效
alter table t1 ALTER CHECK  t1_check  ENFORCED;
alter table t1 ALTER CHECK  t1_check  NOT ENFORCED;

其中除了删check约束是能正常识别,新增和修改check约束是不能正常识别的

测试代码1:

{
            String sql = "ALTER TABLE t1 ADD CONSTRAINT chk1 CHECK((a>1));";
            MySqlStatementParser parser = new MySqlStatementParser(sql);
            List<SQLStatement> statementList = parser.parseStatementList();
            assertEquals(1, statementList.size());
}

报错信息:

com.alibaba.druid.sql.parser.ParserException: syntax error, expect PRIMARY, UNIQUE or FOREIGN, actual CHECK, pos 40, line 1, column 36, token CHECK
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlterSpecification(MySqlStatementParser.java:6025)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlterTable(MySqlStatementParser.java:6769)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlter(MySqlStatementParser.java:5153)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:304)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:113)

测试代码2

{
            String sql = "alter table t1 ALTER CHECK  t1_check  NOT ENFORCED;";
            MySqlStatementParser parser = new MySqlStatementParser(sql);
            List<SQLStatement> statementList = parser.parseStatementList();
            assertEquals(1, statementList.size());
}

报错信息:

com.alibaba.druid.sql.parser.ParserException: illegal name, pos 26, line 1, column 22, token CHECK
	at com.alibaba.druid.sql.parser.SQLExprParser.name(SQLExprParser.java:2031)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlterSpecification(MySqlStatementParser.java:6534)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlterTable(MySqlStatementParser.java:6769)
	at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseAlter(MySqlStatementParser.java:5153)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:304)
	at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:113)

@WillsonYip WillsonYip changed the title Mysql check not enforce语法无法正常识别-2 Mysql 8 check DDL语法无法正常识别 Dec 16, 2020
WillsonYip added a commit to WillsonYip/druid that referenced this issue Dec 25, 2020
WillsonYip added a commit to WillsonYip/druid that referenced this issue Dec 25, 2020
WillsonYip added a commit to WillsonYip/druid that referenced this issue Dec 25, 2020
wenshao added a commit that referenced this issue Dec 25, 2020
support parsing mysql 8 check related DDL statement  #4089
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant