Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions src/main/java/net/sf/jsqlparser/schema/Sequence.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@ public class Sequence extends ASTNodeAccessImpl implements MultiPartName {

private List<Parameter> parameters;
private String dataType;
private SequenceOwnership ownership;

public SequenceOwnership getOwnership() {
return ownership;
}

public void setOwnership(SequenceOwnership ownership) {
this.ownership = ownership;
}

public Sequence() {}

Expand Down Expand Up @@ -151,6 +160,9 @@ public String toString() {
sql.append(" ").append(parameter.formatParameter());
}
}
if (ownership != null) {
sql.append(' ').append(ownership);
}
return sql.toString();
}

Expand All @@ -175,7 +187,7 @@ public Sequence addParameters(Collection<? extends Parameter> 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));
Expand All @@ -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;
Expand All @@ -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;
}
Expand All @@ -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();
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/net/sf/jsqlparser/schema/SequenceOwnership.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
131 changes: 88 additions & 43 deletions src/main/java/net/sf/jsqlparser/statement/LikeClause.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a href="https://docs.exasol.com/db/latest/sql/create_table.htm">Like Clause in CREATE
* TABLE</a>
* @see <a href="https://docs.exasol.com/db/latest/sql/import.htm">Like Clause in IMPORT</a>
*/
public class LikeClause implements ImportColumn, Serializable {
public class LikeClause implements ImportColumn, TableElement, Serializable {
private Table table;
private List<SelectItem<Column>> columnsList;

private Boolean includingDefaults;
private Boolean includingIdentity;
private Boolean includingComments;
private List<Option> options = new ArrayList<>();

public enum OptionKind {
ALL, COMMENTS, COMPRESSION, CONSTRAINTS, DEFAULTS, GENERATED, IDENTITY, INDEXES, STATISTICS, STORAGE
}

public static class Option implements Serializable {
private final OptionKind kind;
private final boolean including;

public Option(OptionKind kind, boolean including) {
this.kind = kind;
this.including = including;
}

public OptionKind getKind() {
return kind;
}

public boolean isIncluding() {
return including;
}

@Override
public String toString() {
return (including ? "INCLUDING " : "EXCLUDING ") + kind;
}
}

/** Options in source order, including repeated options and ALL. */
public List<Option> getOptions() {
return options;
}

public void setOptions(List<Option> options) {
this.options = options == null ? new ArrayList<>() : new ArrayList<>(options);
}

public void addOption(OptionKind kind, boolean including) {
options.add(new Option(kind, including));
}

/** Resolves ALL and explicit options in declaration order; omission defaults to exclusion. */
public boolean isIncluding(OptionKind kind) {
boolean including = false;
for (Option option : options) {
if (option.getKind() == kind || option.getKind() == OptionKind.ALL) {
including = option.isIncluding();
}
}
return including;
}

private Boolean explicitIncluding(OptionKind kind) {
Boolean including = null;
for (Option option : options) {
if (option.getKind() == kind) {
including = option.isIncluding();
}
}
return including;
}

private void setIncluding(OptionKind kind, Boolean including) {
options.removeIf(option -> option.getKind() == kind);
if (including != null) {
addOption(kind, including);
}
}

public Table getTable() {
return table;
Expand All @@ -50,51 +118,51 @@ public void setColumnsList(List<SelectItem<Column>> columnsList) {
}

public Boolean isIncludingDefaults() {
return includingDefaults;
return explicitIncluding(OptionKind.DEFAULTS);
}

public void setIncludingDefaults(Boolean includingDefaults) {
this.includingDefaults = includingDefaults;
setIncluding(OptionKind.DEFAULTS, includingDefaults);
}

public Boolean isExcludingDefaults() {
return includingDefaults == null ? null : !includingDefaults;
return isIncludingDefaults() == null ? null : !isIncludingDefaults();
}

public void setExcludingDefaults(Boolean excludingDefaults) {
this.includingDefaults = !excludingDefaults;
setIncludingDefaults(excludingDefaults == null ? null : !excludingDefaults);
}

public Boolean isIncludingIdentity() {
return includingIdentity;
return explicitIncluding(OptionKind.IDENTITY);
}

public void setIncludingIdentity(Boolean includingIdentity) {
this.includingIdentity = includingIdentity;
setIncluding(OptionKind.IDENTITY, includingIdentity);
}

public Boolean isExcludingIdentity() {
return includingIdentity == null ? null : !includingIdentity;
return isIncludingIdentity() == null ? null : !isIncludingIdentity();
}

public void setExcludingIdentity(Boolean excludingIdentity) {
this.includingIdentity = !excludingIdentity;
setIncludingIdentity(excludingIdentity == null ? null : !excludingIdentity);
}

public Boolean isIncludingComments() {
return includingComments;
return explicitIncluding(OptionKind.COMMENTS);
}

public void setIncludingComments(Boolean includingComments) {
this.includingComments = includingComments;
setIncluding(OptionKind.COMMENTS, includingComments);
}

public Boolean isExcludingComments() {
return includingComments == null ? null : !includingComments;
return isIncludingComments() == null ? null : !isIncludingComments();
}

public void setExcludingComments(Boolean excludingComments) {
this.includingComments = !excludingComments;
setIncludingComments(excludingComments == null ? null : !excludingComments);
}

public StringBuilder appendTo(StringBuilder builder) {
Expand All @@ -105,38 +173,15 @@ public StringBuilder appendTo(StringBuilder builder) {
PlainSelect.appendStringListTo(builder, columnsList, true, true);
}

if (includingDefaults != null) {
if (includingDefaults) {
builder.append(" INCLUDING ");
} else {
builder.append(" EXCLUDING ");
}
builder.append(" DEFAULTS ");
}

if (includingIdentity != null) {
if (includingIdentity) {
builder.append(" INCLUDING ");
} else {
builder.append(" EXCLUDING ");
}
builder.append(" IDENTITY ");
}

if (includingComments != null) {
if (includingComments) {
builder.append(" INCLUDING ");
} else {
builder.append(" EXCLUDING ");
}
builder.append(" COMMENTS ");
for (Option option : options) {
builder.append(' ').append(option);
}

return builder;
}

@Override
public String toString() {
return appendTo(new StringBuilder()).toString();
return appendTo(new StringBuilder()).toString().trim();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,6 @@ public <S> Void visit(CreateTable createTable, S context) {
if (createTable.getSelect() != null) {
// CTAS reads; it does not return a result set - the top level is already claimed
analysis.certain(StmtFeature.READS_DATA);
createTable.getSelect().accept(analysis.selects, context);
}
return super.visit(createTable, context);
}
Expand All @@ -440,11 +439,17 @@ public <S> Void visit(CreateTable createTable, S context) {
public <S> Void visit(CreateView createView, S context) {
analysis.claimTopLevel();
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
analysis.suppressReads(() -> {
if (createView.isMaterialized() && !Boolean.FALSE.equals(createView.getWithData())) {
if (createView.getSelect() != null) {
createView.getSelect().accept(analysis.selects, null);
createView.getSelect().accept(analysis.selects, context);
}
});
} else {
analysis.suppressReads(() -> {
if (createView.getSelect() != null) {
createView.getSelect().accept(analysis.selects, null);
}
});
}
return null;
}

Expand Down
Loading
Loading