From 8b9b37e65d3ed6615cc62c6232ed40da7b7989f4 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 10 Nov 2022 10:44:01 +0100 Subject: [PATCH] [jOOQ/jOOQ#14194] Bad syntax generated when using the Field.collate() clause in CREATE TABLE statements --- jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java | 4 ++-- jOOQ/src/main/java/org/jooq/impl/Collated.java | 2 +- jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Tools.java | 8 ++++++++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index abc2f706ce..715db2af5d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -1299,7 +1299,7 @@ implements } TableElement part = add.get(i); - ctx.qualify(false, c -> c.visit(part)); + ctx.qualify(false, c -> c.visit(Tools.uncollate(part))); if (part instanceof Field f) { ctx.sql(' '); @@ -1329,7 +1329,7 @@ implements - ctx.qualify(false, c -> c.visit(addColumn)).sql(' '); + ctx.qualify(false, c -> c.visit(Tools.uncollate(addColumn))).sql(' '); toSQLDDLTypeDeclarationForAddition(ctx, addColumnType); diff --git a/jOOQ/src/main/java/org/jooq/impl/Collated.java b/jOOQ/src/main/java/org/jooq/impl/Collated.java index beec072220..4e2b813f92 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Collated.java +++ b/jOOQ/src/main/java/org/jooq/impl/Collated.java @@ -61,7 +61,7 @@ final class Collated extends AbstractField implements QOM.Collated { private final Collation collation; Collated(Field field, Collation collation) { - super(field.getQualifiedName(), type(field), field.getCommentPart(), binding(field)); + super(field.getQualifiedName(), type(field).collation(collation), field.getCommentPart(), binding(field)); this.field = field; this.collation = collation; diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index 44c0049cc3..c7684cb01a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -503,7 +503,7 @@ implements if (!first) ctx.sql(',').formatSeparator(); - ctx.visit(field); + ctx.visit(Tools.uncollate(field)); if (select == null) { ctx.sql(' '); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 9c60434b25..015b469cc8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -316,6 +316,7 @@ import org.jooq.SelectFieldOrAsterisk; import org.jooq.SortField; import org.jooq.Source; import org.jooq.Table; +import org.jooq.TableElement; import org.jooq.TableField; import org.jooq.TableRecord; import org.jooq.UDT; @@ -6058,6 +6059,13 @@ final class Tools { return result != null ? result : table; } + static final TableElement uncollate(TableElement field) { + if (field instanceof QOM.Collated c) + return uncollate(c.$field()); + else + return field; + } + static final boolean isScalarSubquery(Field field) { // TODO: Replace other instanceof checks by this one return uncoerce(field) instanceof ScalarSubquery;