From 98880773d3c4cbb95cdf875977fe72b571c81a97 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Wed, 16 May 2018 14:53:05 +0200 Subject: [PATCH] [#7494] Regression on DB2's INSERT .. RETURNING emulation --- jOOQ/src/main/java/org/jooq/SelectField.java | 16 +--- .../java/org/jooq/impl/AbstractDMLQuery.java | 5 ++ .../main/java/org/jooq/impl/JoinTable.java | 4 +- .../java/org/jooq/impl/SelectQueryImpl.java | 2 + jOOQ/src/main/java/org/jooq/impl/Tools.java | 73 +++++++++++++------ 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/SelectField.java b/jOOQ/src/main/java/org/jooq/SelectField.java index ffb5d1465a..ba9403f308 100644 --- a/jOOQ/src/main/java/org/jooq/SelectField.java +++ b/jOOQ/src/main/java/org/jooq/SelectField.java @@ -44,26 +44,12 @@ package org.jooq; * * @author Lukas Eder */ -public interface SelectField extends SelectFieldOrAsterisk { +public interface SelectField extends SelectFieldOrAsterisk, Named { // ------------------------------------------------------------------------ // API // ------------------------------------------------------------------------ - /** - * The name of the field. - *

- * The name is any of these: - *

    - *
  • The formal name of the field, if it is a physical table/view - * field
  • - *
  • The alias of an aliased field
  • - *
  • A generated / unspecified value for any other expression
  • - *
  • The name of a parameter if it is a named {@link Param}
  • - *
- */ - String getName(); - /** * The field's underlying {@link Converter}. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 861741bcc4..7390078a44 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -64,6 +64,7 @@ import static org.jooq.impl.Keywords.K_SELECT; import static org.jooq.impl.Keywords.K_SQL; import static org.jooq.impl.Keywords.K_TABLE; import static org.jooq.impl.Tools.EMPTY_FIELD; +import static org.jooq.impl.Tools.EMPTY_SELECT_FIELD_OR_ASTERISK; import static org.jooq.impl.Tools.EMPTY_STRING; import static org.jooq.impl.Tools.DataKey.DATA_EMULATE_BULK_INSERT_RETURNING; import static org.jooq.util.sqlite.SQLiteDSL.rowid; @@ -166,6 +167,8 @@ abstract class AbstractDMLQuery extends AbstractQuery { returningResolvedAsterisks.addAll(Arrays.asList(((QualifiedAsterisk) f).qualifier().fields())); else if (f instanceof Asterisk) returningResolvedAsterisks.addAll(Arrays.asList(table.fields())); + else + throw new AssertionError("Type not supported: " + f); } // @Override @@ -387,6 +390,8 @@ abstract class AbstractDMLQuery extends AbstractQuery { + + diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 11a64b1d35..4a8165b377 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -395,9 +395,9 @@ implements } context.sql(' ') - .visit(Tools.qualify(field, lhs)) + .visit(Tools.qualify(lhs, field)) .sql(" = ") - .visit(Tools.qualify(field, rhs)); + .visit(Tools.qualify(rhs, field)); } context.end(TABLE_JOIN_ON); diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index cf9b049ff2..0605fd8550 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -1884,6 +1884,8 @@ final class SelectQueryImpl extends AbstractResultQuery imp result.addAll(Arrays.asList(((QualifiedAsterisk) f).qualifier().fields())); else if (f instanceof Asterisk) result.addAll(resolveAsterisk(new QueryPartList>())); + else + throw new AssertionError("Type not supported: " + f); return result; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 42e6a08c7b..fcb9b839c7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -187,6 +187,7 @@ import javax.persistence.Entity; import javax.persistence.Id; // ... +import org.jooq.Asterisk; import org.jooq.Attachable; import org.jooq.BindContext; import org.jooq.Catalog; @@ -205,6 +206,7 @@ import org.jooq.Field; import org.jooq.Name; import org.jooq.OrderField; import org.jooq.Param; +import org.jooq.QualifiedAsterisk; import org.jooq.Query; import org.jooq.QueryPart; import org.jooq.Record; @@ -220,6 +222,8 @@ import org.jooq.RowN; import org.jooq.SQLDialect; import org.jooq.Schema; import org.jooq.Select; +import org.jooq.SelectField; +import org.jooq.SelectFieldOrAsterisk; import org.jooq.SortField; import org.jooq.Table; import org.jooq.TableRecord; @@ -259,26 +263,27 @@ final class Tools { // Empty arrays for use with Collection.toArray() // ------------------------------------------------------------------------ - static final byte[] EMPTY_BYTE = {}; - static final Class[] EMPTY_CLASS = {}; - static final Clause[] EMPTY_CLAUSE = {}; - static final Collection[] EMPTY_COLLECTION = {}; - static final CommonTableExpression[] EMPTY_COMMON_TABLE_EXPRESSION = {}; - static final ExecuteListener[] EMPTY_EXECUTE_LISTENER = {}; - static final Field[] EMPTY_FIELD = {}; - static final int[] EMPTY_INT = {}; - static final Name[] EMPTY_NAME = {}; - static final Param[] EMPTY_PARAM = {}; - static final OrderField[] EMPTY_ORDERFIELD = {}; - static final Query[] EMPTY_QUERY = {}; - static final QueryPart[] EMPTY_QUERYPART = {}; - static final Record[] EMPTY_RECORD = {}; - static final RowN[] EMPTY_ROWN = {}; - static final SortField[] EMPTY_SORTFIELD = {}; - static final String[] EMPTY_STRING = {}; - static final Table[] EMPTY_TABLE = {}; - static final TableRecord[] EMPTY_TABLE_RECORD = {}; - static final UpdatableRecord[] EMPTY_UPDATABLE_RECORD = {}; + static final byte[] EMPTY_BYTE = {}; + static final Class[] EMPTY_CLASS = {}; + static final Clause[] EMPTY_CLAUSE = {}; + static final Collection[] EMPTY_COLLECTION = {}; + static final CommonTableExpression[] EMPTY_COMMON_TABLE_EXPRESSION = {}; + static final ExecuteListener[] EMPTY_EXECUTE_LISTENER = {}; + static final Field[] EMPTY_FIELD = {}; + static final int[] EMPTY_INT = {}; + static final Name[] EMPTY_NAME = {}; + static final Param[] EMPTY_PARAM = {}; + static final OrderField[] EMPTY_ORDERFIELD = {}; + static final Query[] EMPTY_QUERY = {}; + static final QueryPart[] EMPTY_QUERYPART = {}; + static final Record[] EMPTY_RECORD = {}; + static final RowN[] EMPTY_ROWN = {}; + static final SelectFieldOrAsterisk[] EMPTY_SELECT_FIELD_OR_ASTERISK = {}; + static final SortField[] EMPTY_SORTFIELD = {}; + static final String[] EMPTY_STRING = {}; + static final Table[] EMPTY_TABLE = {}; + static final TableRecord[] EMPTY_TABLE_RECORD = {}; + static final UpdatableRecord[] EMPTY_UPDATABLE_RECORD = {}; // ------------------------------------------------------------------------ // Some constants for use with Context.data() @@ -4399,7 +4404,33 @@ final class Tools { return false; } - static final Field qualify(Field field, Table table) { + static final SelectFieldOrAsterisk[] qualify(Table table, SelectFieldOrAsterisk... fields) { + if (fields == null) + return null; + + SelectFieldOrAsterisk[] result = new SelectFieldOrAsterisk[fields.length]; + Name[] part = table.getQualifiedName().parts(); + + for (int i = 0; i < fields.length; i++) { + if (fields[i] instanceof SelectField) { + SelectField field = (SelectField) fields[i]; + Name[] name = new Name[part.length + 1]; + System.arraycopy(part, 0, name, 0, part.length); + name[part.length] = field.getUnqualifiedName(); + result[i] = DSL.field(DSL.name(name), field.getDataType()); + } + else if (fields[i] instanceof QualifiedAsterisk) + result[i] = table.asterisk(); + else if (fields[i] instanceof Asterisk) + result[i] = fields[i]; + else + throw new AssertionError("Type not supported: " + fields[i]); + } + + return result; + } + + static final Field qualify(Table table, Field field) { Field result = table.field(field); if (result != null)