From a0e8dbb495f6f1ba13f1d9943166a016f9e4d788 Mon Sep 17 00:00:00 2001 From: Minjae Lee Date: Thu, 3 Sep 2026 16:35:55 +0900 Subject: [PATCH 1/2] fix(parser): model PostgreSQL CREATE INDEX clauses --- .../statement/create/index/CreateIndex.java | 93 ++++++++++ .../statement/create/table/Index.java | 166 +++++++++++++++++- .../util/deparser/CreateIndexDeParser.java | 20 +++ .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 98 +++++++++-- .../statement/create/CreateIndexTest.java | 55 ++++++ 5 files changed, 414 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java b/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java index fd7573e20..c8156b5e8 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java @@ -12,9 +12,11 @@ import static java.util.stream.Collectors.joining; import java.util.*; +import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.schema.*; import net.sf.jsqlparser.statement.*; import net.sf.jsqlparser.statement.create.table.*; +import net.sf.jsqlparser.statement.select.PlainSelect; public class CreateIndex implements Statement { @@ -25,6 +27,11 @@ public class CreateIndex implements Statement { private boolean usingIfNotExists = false; private boolean concurrently; private boolean only; + private List includeColumns; + private Boolean nullsDistinct; + private List storageParameters; + private String tableSpace; + private Expression where; public boolean isIndexTypeBeforeOn() { return indexTypeBeforeOn; @@ -59,6 +66,46 @@ public void setOnly(boolean only) { this.only = only; } + public List getIncludeColumns() { + return includeColumns; + } + + public void setIncludeColumns(List includeColumns) { + this.includeColumns = includeColumns; + } + + public Boolean getNullsDistinct() { + return nullsDistinct; + } + + public void setNullsDistinct(Boolean nullsDistinct) { + this.nullsDistinct = nullsDistinct; + } + + public List getStorageParameters() { + return storageParameters; + } + + public void setStorageParameters(List storageParameters) { + this.storageParameters = storageParameters; + } + + public String getTableSpace() { + return tableSpace; + } + + public void setTableSpace(String tableSpace) { + this.tableSpace = tableSpace; + } + + public Expression getWhere() { + return where; + } + + public void setWhere(Expression where) { + this.where = where; + } + @Override public T accept(StatementVisitor statementVisitor, S context) { return statementVisitor.visit(this, context); @@ -135,6 +182,8 @@ public String toString() { buffer.append(")"); + appendPostgreSqlTail(buffer); + if (tailParameters != null) { for (String param : tailParameters) { buffer.append(" ").append(param); @@ -145,6 +194,25 @@ public String toString() { return buffer.toString(); } + private void appendPostgreSqlTail(StringBuilder buffer) { + if (includeColumns != null) { + buffer.append(" INCLUDE (").append(String.join(", ", includeColumns)).append(")"); + } + if (nullsDistinct != null) { + buffer.append(" NULLS ").append(nullsDistinct ? "DISTINCT" : "NOT DISTINCT"); + } + if (storageParameters != null) { + buffer.append(" WITH ") + .append(PlainSelect.getStringList(storageParameters, true, true)); + } + if (tableSpace != null) { + buffer.append(" TABLESPACE ").append(tableSpace); + } + if (where != null) { + buffer.append(" WHERE ").append(where); + } + } + public CreateIndex withTable(Table table) { this.setTable(table); return this; @@ -169,4 +237,29 @@ public CreateIndex withOnly(boolean only) { setOnly(only); return this; } + + public CreateIndex withIncludeColumns(List includeColumns) { + setIncludeColumns(includeColumns); + return this; + } + + public CreateIndex withNullsDistinct(Boolean nullsDistinct) { + setNullsDistinct(nullsDistinct); + return this; + } + + public CreateIndex withStorageParameters(List storageParameters) { + setStorageParameters(storageParameters); + return this; + } + + public CreateIndex withTableSpace(String tableSpace) { + setTableSpace(tableSpace); + return this; + } + + public CreateIndex withWhere(Expression where) { + setWhere(where); + return this; + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java b/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java index 114b30d14..a7d2ad518 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/Index.java @@ -200,9 +200,22 @@ public void setCommentText(String commentText) { } public static class ColumnParams implements Serializable { + public enum SortOrder { + ASC, DESC + } + + public enum NullOrdering { + FIRST, LAST + } + public final String columnName; public final List params; private final Expression expression; + private String collation; + private String operatorClass; + private List