String dbType = JdbcConstants.HIVE; String sql = "CREATE TABLE IF NOT EXISTS default.create_test (id int COMMENT '学号', name string COMMENT '姓名');"; String sqlBeauty = SQLUtils.format(sql , dbType); System.out.println(sqlBeauty);
报错:
[2019-02-22 17:18:36,783] WARN
format error com.alibaba.druid.sql.parser.ParserException: error pos 34, line 1, column 27, token DEFAULT at com.alibaba.druid.sql.parser.SQLExprParser.name(SQLExprParser.java:1370) at com.alibaba.druid.sql.dialect.hive.parser.HiveCreateTableParser.parseCreateTable(HiveCreateTableParser.java:71) at com.alibaba.druid.sql.parser.SQLStatementParser.parseCreate(SQLStatementParser.java:2028) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:161) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:72) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:255) at com.alibaba.druid.sql.SQLUtils.format(SQLUtils.java:241) at com.inspur.tax.sjjggl.common.util.SqlParserUtil.main(SqlParserUtil.java:75) CREATE TABLE IF NOT EXISTS default.create_test (id int COMMENT '学号', name string COMMENT '姓名');
Process finished with exit code 0
其他库名格式化正常
原提问者GitHub用户muzhix
当格式化Hive的CREATE TABLE语句时,当库(database)名称为default时会报错。
这 likely 是一个SQLFormatter的bug。
Hive中,列名、表名、库名不能使用关键字,比如default。
但是有些SQLFormatter认为default是一个有效的名字,所以不会报错。
当要执行这个CREATE语句时,Hive服务器上会报错表明default是关键字不能用。
解决方案是:
使用支持Hive的SQLFormatter,了解Hive的关键字与限制。
自定义SQLFormatter,加入Hive关键字检查。
改写直接使用Hive的SQL解析器执行检查。
使用库名"default"时,加上``标识符引起来,可以规避此问题。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。