diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 3fff253dbc..1c74fff992 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -65,6 +65,8 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS protected final List sortedBy = new ArrayList(); protected int buckets; + protected Map tableOptions = new LinkedHashMap(); + public SQLCreateTableStatement(){ } @@ -231,6 +233,10 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS this.partitioning = partitioning; } + public Map getTableOptions() { + return tableOptions; + } + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index abafeaab2c..58607be14b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -66,10 +66,6 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement this.tableOptions = tableOptions; } - public Map getTableOptions() { - return tableOptions; - } - @Deprecated public SQLSelect getQuery() { return select; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 62e7f1d1d0..bd237b8a65 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -46,6 +46,7 @@ import com.alibaba.druid.util.JdbcConstants; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor, OracleASTVisitor { @@ -2275,6 +2276,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor println(); x.getSelect().accept(this); } + return false; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index 5fa4c1cf3e..37644b4689 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.parser; import java.util.List; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.util.FnvHash; @@ -130,7 +131,7 @@ public class SQLCreateTableParser extends SQLDDLParser { accept(Token.RPAREN); - if (lexer.identifierEquals("INHERITS")) { + if (lexer.identifierEquals(FnvHash.Constants.INHERITS)) { lexer.nextToken(); accept(Token.LPAREN); SQLName inherits = this.exprParser.name(); @@ -145,6 +146,29 @@ public class SQLCreateTableParser extends SQLDDLParser { createTable.setSelect(select); } + if (lexer.token == Token.WITH && JdbcConstants.POSTGRESQL.equals(dbType)) { + lexer.nextToken(); + accept(Token.LPAREN); + + for (;;) { + String name = lexer.stringVal(); + lexer.nextToken(); + accept(Token.EQ); + SQLExpr value = this.exprParser.expr(); + value.setParent(createTable); + + createTable.getTableOptions().put(name, value); + + if (lexer.token == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + accept(Token.RPAREN); + } + return createTable; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index bf8ba688f2..2832aaaa85 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -2431,10 +2431,14 @@ public class SQLExprParser extends SQLParser { if (lexer.identifierEquals(FnvHash.Constants.COLLATE)) { lexer.nextToken(); - if (lexer.token != Token.IDENTIFIER) { + if (lexer.token == Token.LITERAL_ALIAS) { + charType.setCollate(lexer.stringVal()); + } else if (lexer.token == Token.IDENTIFIER) { + charType.setCollate(lexer.stringVal()); + } else { throw new ParserException(); } - charType.setCollate(lexer.stringVal()); + lexer.nextToken(); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 07ca4fd4ba..d8aa288294 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2530,6 +2530,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLCreateTableStatement x) { printCreateTable(x, true); + Map options = x.getTableOptions(); + if (options.size() > 0) { + println(); + print0(ucase ? "WITH (" : "with ("); + int i = 0; + for (Map.Entry option : x.getTableOptions().entrySet()) { + if (i > 0) { + print0(", "); + } + String key = option.getKey(); + print0(key); + + print0(" = "); + + option.getValue().accept(this); + ++i; + } + print(')'); + } + return false; } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 6cd9101eb3..aa98fb6584 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -620,5 +620,6 @@ public final class FnvHash { long SAVEPOINT = fnv1a_64_lower("SAVEPOINT"); long RELEASE = fnv1a_64_lower("RELEASE"); long MERGE = fnv1a_64_lower("MERGE"); + long INHERITS = fnv1a_64_lower("INHERITS"); } }