[jOOQ/jOOQ#10523] Fix this for dialects that do not support correlated derived tables

This commit is contained in:
Lukas Eder 2022-03-30 14:02:55 +02:00
parent 1d659422d8
commit 6f0e558c3e
2 changed files with 87 additions and 3 deletions

View File

@ -258,14 +258,12 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<FieldOrRow, FieldOrRo
visitSubquery(ctx, select, false, false, false);
}
else {
Field<?>[] f = Tools.fields(size);
for (int i = 0; i < size; i++) {
FieldMapForUpdate mu = new FieldMapForUpdate(table, setClause, null);
separator = mu.acceptAssignmentClause(ctx,
supportsQualify,
row.field(i),
field(select(f[i]).from(select.asTable(table(name("t")), f))),
new ProjectSingleScalarSubquery<>(select, i),
separator
);
}

View File

@ -0,0 +1,86 @@
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* ASL 2.0 and offer limited warranties, support, maintenance, and commercial
* database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq.impl;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.select;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.Names.N_SELECT;
import java.util.Arrays;
import org.jooq.Context;
import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Select;
/**
* A scalar subquery that wraps a non-scalar subquery, but projects only one of
* its columns either by SQL transformation, or via a derived table.
*
* @author Lukas Eder
*/
@SuppressWarnings("unchecked")
final class ProjectSingleScalarSubquery<T> extends AbstractField<T> implements QOM.UTransient {
final Select<?> query;
final int index;
ProjectSingleScalarSubquery(Select<?> query, int index) {
super(N_SELECT, (DataType<T>) query.getSelect().get(index).getDataType());
this.query = query;
this.index = index;
}
@Override
public final void accept(Context<?> ctx) {
SelectQueryImpl<?> q = Tools.selectQueryImpl(query);
if (q.$distinct()
|| !q.$orderBy().isEmpty()
|| q.hasUnions()) {
Field<?>[] f = Tools.fields(query.getSelect().size());
ctx.visit(DSL.field(select(f[index]).from(query.asTable(table(name("t")), f))));
}
else
ctx.visit(DSL.field((Select<Record1<T>>) query.$select(Arrays.asList(query.$select().get(index)))));
}
}