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
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.schema.Table;
Expand Down Expand Up @@ -52,16 +53,20 @@ public void setEnforced(Boolean enforced) {
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
public void appendTo(StringBuilder b, Consumer<Expression> expressionPrinter) {
appendConstraintPrefixTo(b);
b.append("CHECK (").append(expression).append(")");
b.append("CHECK (");
if (expression == null) {
b.append("null");
} else {
expressionPrinter.accept(expression);
}
b.append(')');
if (enforced != null) {
b.append(enforced ? " ENFORCED" : " NOT ENFORCED");
}
appendConstraintSuffixTo(b);
appendConstraintAttributesTo(b);
return b.toString();
}

public CheckConstraint withTable(Table table) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.PlainSelect;

public class ExcludeConstraint extends Index {

Expand All @@ -33,8 +33,7 @@ public void setExpression(Expression expression) {
}

@Override
public String toString() {
StringBuilder exclusionStatement = new StringBuilder();
public void appendTo(StringBuilder exclusionStatement, Consumer<Expression> expressionPrinter) {
if (getName() != null) {
exclusionStatement.append("CONSTRAINT ").append(getName()).append(' ');
}
Expand All @@ -43,15 +42,16 @@ public String toString() {
exclusionStatement.append(" USING ").append(getUsing());
}
if (getColumns() != null) {
exclusionStatement.append(' ')
.append(PlainSelect.getStringList(getColumns(), true, true));
exclusionStatement.append(' ');
appendColumnsTo(exclusionStatement, expressionPrinter);
}
appendConstraintOptionsTo(exclusionStatement);
appendConstraintOptionsTo(exclusionStatement, expressionPrinter);
if (expression != null) {
exclusionStatement.append(" WHERE (").append(expression).append(')');
exclusionStatement.append(" WHERE (");
expressionPrinter.accept(expression);
exclusionStatement.append(')');
}
appendConstraintAttributesTo(exclusionStatement);
return exclusionStatement.toString();
}

public ExcludeConstraint withExpression(Expression expression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.function.Consumer;
import net.sf.jsqlparser.expression.Expression;
import java.util.Optional;
import java.util.Set;

Expand Down Expand Up @@ -165,8 +167,9 @@ public void setOnUpdateReferenceOption(String onUpdateReferenceOption) {
}

@Override
public String toString() {
StringBuilder b = new StringBuilder(super.toString()).append(" ");
public void appendTo(StringBuilder b, Consumer<Expression> expressionPrinter) {
super.appendTo(b, expressionPrinter);
b.append(' ');
if (reference != null) {
b.append(reference);
} else {
Expand All @@ -176,7 +179,6 @@ public String toString() {
}
appendConstraintSuffixTo(b);
appendConstraintAttributesTo(b);
return b.toString();
}

public ForeignKeyIndex withTable(Table table) {
Expand Down
62 changes: 43 additions & 19 deletions src/main/java/net/sf/jsqlparser/statement/create/table/Index.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,17 @@ public String nullsDistinctClause() {
}

public void appendConstraintOptionsTo(StringBuilder sql) {
appendConstraintOptionsTo(sql, sql::append);
}

public void appendConstraintOptionsTo(StringBuilder sql,
Consumer<Expression> expressionPrinter) {
if (includeColumns != null) {
sql.append(" INCLUDE ").append(PlainSelect.getStringList(includeColumns, true, true));
}
if (storageParameters != null) {
sql.append(" WITH ").append(PlainSelect.getStringList(storageParameters, true, true));
sql.append(" WITH ");
Option.appendListTo(sql, storageParameters, expressionPrinter);
}
if (tableSpace != null) {
sql.append(" USING INDEX TABLESPACE ").append(tableSpace);
Expand Down Expand Up @@ -283,31 +289,49 @@ public Index withIndexKeyword(String indexKeyword) {

@Override
public String toString() {
StringBuilder sql = new StringBuilder();
appendTo(sql, sql::append);
return sql.toString();
}

/** Renders index definitions through the supplied expression writer. */
public void appendTo(StringBuilder sql, Consumer<Expression> expressionPrinter) {
String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
String keyword = indexKeyword != null
&& (type == null || !type.toUpperCase(java.util.Locale.ROOT)
.endsWith(indexKeyword.toUpperCase(java.util.Locale.ROOT)))
? " " + indexKeyword
: "";
String head =
(type != null ? type : "") +
keyword +
(!name.isEmpty() ? " " + getName() : "") +
(using != null ? " USING " + using : "");

String tail = (columns != null && !columns.isEmpty()
? PlainSelect.getStringList(columns, true, true)
: "")
+ (!idxSpecText.isEmpty() ? " " + idxSpecText : "");

StringBuilder sql = new StringBuilder(head).append(nullsDistinctClause())
.append(clusteringClause());
if (!tail.isEmpty()) {
sql.append(' ').append(tail);
}
appendConstraintOptionsTo(sql);
sql.append(type != null ? type : "").append(keyword);
if (!name.isEmpty()) {
sql.append(' ').append(getName());
}
if (using != null) {
sql.append(" USING ").append(using);
}
sql.append(nullsDistinctClause()).append(clusteringClause());
boolean hasColumns = columns != null && !columns.isEmpty();
if (hasColumns) {
sql.append(' ');
appendColumnsTo(sql, expressionPrinter);
}
if (!idxSpecText.isEmpty()) {
sql.append(hasColumns ? " " : " ").append(idxSpecText);
}
appendConstraintOptionsTo(sql, expressionPrinter);
appendConstraintAttributesTo(sql);
return sql.toString();
}

/** Appends a parenthesized list of keys, including expression keys and operator options. */
protected void appendColumnsTo(StringBuilder sql, Consumer<Expression> expressionPrinter) {
sql.append('(');
for (int i = 0; i < columns.size(); i++) {
if (i > 0) {
sql.append(", ");
}
columns.get(i).appendTo(sql, expressionPrinter);
}
sql.append(')');
}

public Index withType(String type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import net.sf.jsqlparser.expression.Expression;

import net.sf.jsqlparser.statement.select.PlainSelect;

Expand Down Expand Up @@ -81,32 +83,34 @@ public void setUseConstraintKeyword(boolean useConstraintKeyword) {
}

@Override
public String toString() {
public void appendTo(StringBuilder sql, Consumer<Expression> expressionPrinter) {
String idxSpecText = PlainSelect.getStringList(getIndexSpec(), false, false);
String keyword = getIndexKeyword() != null
&& !getType().toUpperCase(java.util.Locale.ROOT)
.endsWith(getIndexKeyword().toUpperCase(java.util.Locale.ROOT))
? " " + getIndexKeyword()
: "";
String tail = getType()
+ nullsDistinctClause()
+ keyword
+ clusteringClause()
+ (indexName != null ? " " + indexName : "")
+ (getUsing() != null ? " USING " + getUsing() : "")
+ (getColumns() == null ? ""
: " " + PlainSelect.getStringList(getColumnsNames(), true, true))
+
(!"".equals(idxSpecText) ? " " + idxSpecText : "");
StringBuilder sql = new StringBuilder();
appendConstraintPrefixTo(sql);
sql.append(tail);
appendConstraintOptionsTo(sql);
sql.append(getType()).append(nullsDistinctClause()).append(keyword)
.append(clusteringClause());
if (indexName != null) {
sql.append(' ').append(indexName);
}
if (getUsing() != null) {
sql.append(" USING ").append(getUsing());
}
if (getColumns() != null) {
sql.append(' ');
appendColumnsTo(sql, expressionPrinter);
}
if (!idxSpecText.isEmpty()) {
sql.append(' ').append(idxSpecText);
}
appendConstraintOptionsTo(sql, expressionPrinter);
if (getKind() != Kind.FOREIGN_KEY) {
appendConstraintSuffixTo(sql);
appendConstraintAttributesTo(sql);
}
return sql.toString();
}

public NamedConstraint withIndexName(String indexName) {
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/net/sf/jsqlparser/util/deparser/AlterDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.statement.alter.AlterExpression;
import net.sf.jsqlparser.statement.alter.AlterExpressionPrimaryKey;
import net.sf.jsqlparser.statement.create.table.DefaultConstraint;
import net.sf.jsqlparser.statement.alter.AlterOperation;
import net.sf.jsqlparser.statement.select.PlainSelect;
import java.util.Iterator;

Expand Down Expand Up @@ -54,9 +54,17 @@ private void deParseAction(AlterExpression action) {
expression -> expression.accept(expressionVisitor, null));
return;
}
if (action.getIndex() instanceof DefaultConstraint) {
if (action.getOperation() == AlterOperation.ADD && action.getIndex() != null
&& action.getConstraintType() == null) {
builder.append(action.getOperation()).append(' ');
new TableElementDeParser(builder, expressionVisitor).deParse(action.getIndex());
if (action.getConstraints() != null && !action.getConstraints().isEmpty()) {
builder.append(' ')
.append(PlainSelect.getStringList(action.getConstraints(), false, false));
}
if (action.getUseEqual()) {
builder.append('=');
}
deParseTail(action);
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,9 @@
*/
package net.sf.jsqlparser.util.deparser;

import java.util.Iterator;
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.statement.create.table.CheckConstraint;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.ColumnOption;
import net.sf.jsqlparser.statement.create.table.DefaultConstraint;
import net.sf.jsqlparser.statement.create.table.ExcludeConstraint;
import net.sf.jsqlparser.statement.create.table.Index;
import net.sf.jsqlparser.statement.create.table.TableElement;

Expand All @@ -31,13 +27,9 @@ public TableElementDeParser(StringBuilder builder,

@Override
public void deParse(TableElement element) {
if (element instanceof DefaultConstraint) {
((DefaultConstraint) element).appendTo(builder,
if (element instanceof Index) {
((Index) element).appendTo(builder,
expression -> expression.accept(expressionVisitor, null));
} else if (element instanceof ExcludeConstraint) {
deParseExclude((ExcludeConstraint) element);
} else if (element instanceof CheckConstraint) {
deParseCheck((CheckConstraint) element);
} else if (element instanceof ColumnDefinition
&& ((ColumnDefinition) element).getColumnOptions() != null) {
deParseColumn((ColumnDefinition) element);
Expand All @@ -64,48 +56,4 @@ private void deParseColumn(ColumnDefinition column) {
}
}

private void deParseExclude(ExcludeConstraint constraint) {
if (constraint.getName() != null) {
builder.append("CONSTRAINT ").append(constraint.getName()).append(' ');
}
builder.append("EXCLUDE");
if (constraint.getUsing() != null) {
builder.append(" USING ").append(constraint.getUsing());
}
if (constraint.getColumns() != null) {
builder.append(" (");
for (Iterator<Index.ColumnParams> iterator =
constraint.getColumns().iterator(); iterator.hasNext();) {
iterator.next().appendTo(builder,
expression -> expression.accept(expressionVisitor, null));
if (iterator.hasNext()) {
builder.append(", ");
}
}
builder.append(')');
}
constraint.appendConstraintOptionsTo(builder);
if (constraint.getExpression() != null) {
builder.append(" WHERE (");
constraint.getExpression().accept(expressionVisitor, null);
builder.append(')');
}
constraint.appendConstraintAttributesTo(builder);
}

private void deParseCheck(CheckConstraint constraint) {
constraint.appendConstraintPrefixTo(builder);
builder.append("CHECK (");
if (constraint.getExpression() != null) {
constraint.getExpression().accept(expressionVisitor, null);
} else {
builder.append("null");
}
builder.append(')');
if (constraint.getEnforced() != null) {
builder.append(constraint.getEnforced() ? " ENFORCED" : " NOT ENFORCED");
}
constraint.appendConstraintSuffixTo(builder);
constraint.appendConstraintAttributesTo(builder);
}
}
Loading
Loading