From 1261e6af8ca60ee67a0b200164b4489534d8c9bd Mon Sep 17 00:00:00 2001 From: Minjae Lee Date: Sun, 6 Sep 2026 14:37:58 +0900 Subject: [PATCH 1/2] feat(parser): model PostgreSQL schema DDL clauses --- .../net/sf/jsqlparser/schema/Sequence.java | 29 +- .../jsqlparser/schema/SequenceOwnership.java | 43 ++ .../sf/jsqlparser/statement/LikeClause.java | 131 +++-- .../statement/StatementFeatureVisitor.java | 13 +- .../statement/StatementVisitorAdapter.java | 36 +- .../statement/alter/AlterExpression.java | 30 +- .../statement/alter/IdentityAlteration.java | 100 ++++ .../create/table/CheckConstraint.java | 1 + .../create/table/ColumnDefinition.java | 19 +- .../statement/create/table/ColumnOption.java | 42 +- .../create/table/ConstraintAttributes.java | 66 +++ .../statement/create/table/CreateTable.java | 33 ++ .../create/table/ExcludeConstraint.java | 27 +- .../create/table/ForeignKeyIndex.java | 1 + .../create/table/IdentityDefinition.java | 59 ++ .../statement/create/table/Index.java | 107 +++- .../create/table/NamedConstraint.java | 12 +- .../statement/create/view/CreateView.java | 146 ++++- .../statement/create/view/ViewOption.java | 105 ++++ .../util/TableDefinitionTraversal.java | 98 ++++ .../sf/jsqlparser/util/TablesNamesFinder.java | 27 +- .../util/deparser/AlterDeParser.java | 49 +- .../util/deparser/CreateTableDeParser.java | 36 +- .../util/deparser/CreateViewDeParser.java | 14 +- .../util/deparser/StatementDeParser.java | 4 +- .../util/deparser/TableElementDeParser.java | 112 ++++ .../validation/feature/PostgresqlVersion.java | 68 +-- .../validator/AlterSequenceValidator.java | 3 + .../validation/validator/AlterValidator.java | 9 + .../validator/CreateSequenceValidator.java | 3 + .../validator/CreateTableValidator.java | 3 + .../validator/CreateViewValidator.java | 1 + .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 536 +++++++++++++----- src/site/sphinx/usage.rst | 44 +- .../create/PostgreSqlCreateViewTest.java | 112 ++++ .../create/PostgreSqlSchemaDdlTest.java | 236 ++++++++ .../create/PostgreSqlSchemaTraversalTest.java | 133 +++++ .../util/TablesNamesFinderTest.java | 12 +- 38 files changed, 2208 insertions(+), 292 deletions(-) create mode 100644 src/main/java/net/sf/jsqlparser/schema/SequenceOwnership.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/alter/IdentityAlteration.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/create/table/ConstraintAttributes.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/create/table/IdentityDefinition.java create mode 100644 src/main/java/net/sf/jsqlparser/statement/create/view/ViewOption.java create mode 100644 src/main/java/net/sf/jsqlparser/util/TableDefinitionTraversal.java create mode 100644 src/main/java/net/sf/jsqlparser/util/deparser/TableElementDeParser.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/create/PostgreSqlCreateViewTest.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/create/PostgreSqlSchemaDdlTest.java create mode 100644 src/test/java/net/sf/jsqlparser/statement/create/PostgreSqlSchemaTraversalTest.java diff --git a/src/main/java/net/sf/jsqlparser/schema/Sequence.java b/src/main/java/net/sf/jsqlparser/schema/Sequence.java index 5d7b960cdc..efff62a970 100644 --- a/src/main/java/net/sf/jsqlparser/schema/Sequence.java +++ b/src/main/java/net/sf/jsqlparser/schema/Sequence.java @@ -30,6 +30,15 @@ public class Sequence extends ASTNodeAccessImpl implements MultiPartName { private List parameters; private String dataType; + private SequenceOwnership ownership; + + public SequenceOwnership getOwnership() { + return ownership; + } + + public void setOwnership(SequenceOwnership ownership) { + this.ownership = ownership; + } public Sequence() {} @@ -151,6 +160,9 @@ public String toString() { sql.append(" ").append(parameter.formatParameter()); } } + if (ownership != null) { + sql.append(' ').append(ownership); + } return sql.toString(); } @@ -175,7 +187,7 @@ public Sequence addParameters(Collection parameters) { * The available parameters to a sequence */ public enum ParameterType { - INCREMENT_BY, INCREMENT, START_WITH, START, RESTART_WITH, MAXVALUE, NOMAXVALUE, MINVALUE, NOMINVALUE, CYCLE, NOCYCLE, CACHE, NOCACHE, ORDER, NOORDER, KEEP, NOKEEP, SESSION, GLOBAL; + INCREMENT_BY, INCREMENT, START_WITH, START, RESTART_WITH, MAXVALUE, NOMAXVALUE, MINVALUE, NOMINVALUE, CYCLE, NOCYCLE, CACHE, NOCACHE, ORDER, NOORDER, KEEP, NOKEEP, SESSION, GLOBAL, NO_MINVALUE, NO_MAXVALUE, NO_CYCLE; public static ParameterType from(String type) { return Enum.valueOf(ParameterType.class, type.toUpperCase(Locale.ROOT)); @@ -185,7 +197,7 @@ public static ParameterType from(String type) { /** * Represents a parameter when declaring a sequence */ - public static class Parameter { + public static class Parameter implements java.io.Serializable { private final ParameterType option; private Long value; @@ -198,6 +210,15 @@ public Long getValue() { return value; } + public ParameterType getOption() { + return option; + } + + @Override + public String toString() { + return formatParameter(); + } + public void setValue(Long value) { this.value = value; } @@ -222,6 +243,10 @@ public String formatParameter() { case MINVALUE: case CACHE: return prefix(option.name()); + case NO_MINVALUE: + case NO_MAXVALUE: + case NO_CYCLE: + return option.name().replace('_', ' '); default: // fallthrough just return option name return option.name(); diff --git a/src/main/java/net/sf/jsqlparser/schema/SequenceOwnership.java b/src/main/java/net/sf/jsqlparser/schema/SequenceOwnership.java new file mode 100644 index 0000000000..8f3f95322e --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/schema/SequenceOwnership.java @@ -0,0 +1,43 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2026 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.schema; + +import java.io.Serializable; +import java.util.Objects; + +/** Distinguishes explicit OWNED BY NONE from an owning column and from an omitted clause. */ +public class SequenceOwnership implements Serializable { + private final Column column; + + private SequenceOwnership(Column column) { + this.column = column; + } + + public static SequenceOwnership none() { + return new SequenceOwnership(null); + } + + public static SequenceOwnership ownedBy(Column column) { + return new SequenceOwnership(Objects.requireNonNull(column, "column")); + } + + public Column getColumn() { + return column; + } + + public boolean isNone() { + return column == null; + } + + @Override + public String toString() { + return "OWNED BY " + (column == null ? "NONE" : column); + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java index 448b4de72a..35e0cc70bd 100644 --- a/src/main/java/net/sf/jsqlparser/statement/LikeClause.java +++ b/src/main/java/net/sf/jsqlparser/statement/LikeClause.java @@ -12,26 +12,94 @@ import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.imprt.ImportColumn; +import net.sf.jsqlparser.statement.create.table.TableElement; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.SelectItem; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; /** - * Exasol Like Clause + * A LIKE clause used in table definitions and Exasol imports. * * @see Like Clause in CREATE * TABLE * @see Like Clause in IMPORT */ -public class LikeClause implements ImportColumn, Serializable { +public class LikeClause implements ImportColumn, TableElement, Serializable { private Table table; private List> columnsList; - private Boolean includingDefaults; - private Boolean includingIdentity; - private Boolean includingComments; + private List