#6168·druid

[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

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的建表语句没有对应的解析逻辑:

java
public class SQLTableLike extends SQLObjectImpl implements SQLTableElement {
    private SQLExprTableSource table;
    private boolean includeProperties;
    private boolean excludeProperties;
}

Testcase Code

java
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_