From d0bdeea07f8ed50348e4215b229ea17e4a8d0c4f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 15 Nov 2022 10:43:41 +0100 Subject: [PATCH] [jOOQ/jOOQ#14215] Plain SQL INSERT .. RETURNING doesn't work with unqualified field templates in SQL Server See also [jOOQ/jOOQ#14218] --- .../src/main/java/org/jooq/impl/SQLField.java | 4 ++-- jOOQ/src/main/java/org/jooq/impl/SQLImpl.java | 20 +++++++++++++++++-- jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 +++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLField.java b/jOOQ/src/main/java/org/jooq/impl/SQLField.java index 8d01c3d1f1..71b5cbb507 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLField.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLField.java @@ -45,12 +45,12 @@ import org.jooq.impl.QOM.UEmptyField; final class SQLField extends AbstractField implements UEmptyField, TypedReference { - private final QueryPart delegate; + final SQLImpl delegate; SQLField(DataType type, SQL delegate) { super(DSL.unquotedName(delegate.toString()), type); - this.delegate = delegate; + this.delegate = (SQLImpl) delegate; } // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLImpl.java b/jOOQ/src/main/java/org/jooq/impl/SQLImpl.java index 629df18470..7c1a958933 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLImpl.java @@ -54,12 +54,28 @@ import org.jooq.impl.QOM.UEmpty; final class SQLImpl extends AbstractQueryPart implements SQL, UEmpty { private static final Clause[] CLAUSES = { TEMPLATE }; - private final String sql; - private final List substitutes; + final String sql; + final boolean isName; + final List substitutes; SQLImpl(String sql, Object... input) { this.sql = requireNonNull(sql); this.substitutes = Tools.queryParts(input); + this.isName = substitutes.isEmpty() && isName(sql); + } + + static final boolean isName(String sql) { + int l = sql.length(); + + // [#14215] Good enough approximation of SQL identifiers + if (l == 0 || !Character.isJavaIdentifierStart(sql.charAt(0))) + return false; + + for (int i = 1; i < l; i++) + if (!Character.isJavaIdentifierPart(sql.charAt(i))) + return false; + + return true; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 015b469cc8..718d2ff1c7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -1686,6 +1686,11 @@ final class Tools { return result; } + static final boolean reference(Field field) { + return field instanceof TableField + || field instanceof SQLField && ((SQLField) field).delegate.isName; + } + static final Field unqualified(Field field) { return DSL.field(field.getUnqualifiedName(), field.getDataType()); }