[BUG] PG的CREATE TABLE (LIKE INCLUDING DEFAULTS)语句解析失败
Author: chhuaxCreated Oct 14, 2024Updated Aug 2, 2026
Database Type
PostgreSQL
Database Version
14
Druid Version
1.2.8,1.2.24
JDK Version
OpenJDK8
Error SQL
CREATE TABLE new_table (
LIKE existing_table INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES
);
CREATE TABLE archived_orders (
LIKE orders INCLUDING CONSTRAINTS,
archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (order_id, archived_at)
);此类语句SQLTableLike是作为SQLTableElement的一种,在MySQL的建表语句中有对应的解析逻辑,代码中也定义了SQLTableLike的,但是属性有欠缺,且PG的建表语句没有对应的解析逻辑:
public class SQLTableLike extends SQLObjectImpl implements SQLTableElement {
private SQLExprTableSource table;
private boolean includeProperties;
private boolean excludeProperties;
}Testcase Code
List<SQLStatement> sqlStatements = SQLUtils.parseStatements(
"CREATE TABLE archived_orders (\n"
+ " LIKE orders INCLUDING CONSTRAINTS, -- 复制表的约束\n"
+ " archived_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n"
+ " UNIQUE (order_id, archived_at) -- 新增唯一约束\n"
+ ");", DbType.postgresql)Stacktrace Info
com.alibaba.druid.sql.parser.ParserException: illegal name, pos 39, line 2, column 6, token LIKE
at com.alibaba.druid.sql.parser.SQLExprParser.name(SQLExprParser.java:2335)
at com.alibaba.druid.sql.parser.SQLExprParser.parseColumn(SQLExprParser.java:4578)
at com.alibaba.druid.sql.parser.SQLExprParser.parseColumn(SQLExprParser.java:4572)
at com.alibaba.druid.sql.parser.SQLCreateTableParser.parseCreateTable(SQLCreateTableParser.java:127)
at com.alibaba.druid.sql.parser.SQLCreateTableParser.parseCreateTable(SQLCreateTableParser.java:45)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseCreate(SQLStatementParser.java:3368)
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:258)
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:566)
at com.alibaba.druid.sql.SQLUtils.parseStatements(SQLUtils.java:588)```
### Error Info
_No response_Source: alibaba/druid