[jOOQ/jOOQ#14215] Plain SQL INSERT .. RETURNING doesn't work with unqualified field templates in SQL Server

See also [jOOQ/jOOQ#14218]
This commit is contained in:
Lukas Eder 2022-11-15 10:43:41 +01:00
parent 260e59aa46
commit d0bdeea07f
3 changed files with 25 additions and 4 deletions

View File

@ -45,12 +45,12 @@ import org.jooq.impl.QOM.UEmptyField;
final class SQLField<T> extends AbstractField<T> implements UEmptyField<T>, TypedReference<T> {
private final QueryPart delegate;
final SQLImpl delegate;
SQLField(DataType<T> type, SQL delegate) {
super(DSL.unquotedName(delegate.toString()), type);
this.delegate = delegate;
this.delegate = (SQLImpl) delegate;
}
// ------------------------------------------------------------------------

View File

@ -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<QueryPart> substitutes;
final String sql;
final boolean isName;
final List<QueryPart> 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

View File

@ -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 <T> Field<T> unqualified(Field<T> field) {
return DSL.field(field.getUnqualifiedName(), field.getDataType());
}