diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index e46edc24ea..a2883c0080 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -768,7 +768,7 @@ abstract class AbstractField extends AbstractTypedNamed implements Field> query) { + public final LikeEscapeStep like(QuantifiedSelect> query) { return new QuantifiedComparisonCondition(query, this, LIKE); } @@ -823,7 +823,7 @@ abstract class AbstractField extends AbstractTypedNamed implements Field> query) { + public final LikeEscapeStep notLike(QuantifiedSelect> query) { return new QuantifiedComparisonCondition(query, this, NOT_LIKE); } diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java b/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java new file mode 100644 index 0000000000..72a8427e64 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java @@ -0,0 +1,1826 @@ +/* + * 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 java.math.BigDecimal; +import java.util.Collection; +import java.util.Map; +import java.util.function.Function; + +import org.jooq.BetweenAndStep; +import org.jooq.BindContext; +import org.jooq.Binding; +import org.jooq.Clause; +import org.jooq.Collation; +import org.jooq.Comparator; +import org.jooq.Condition; +import org.jooq.Configuration; +import org.jooq.Context; +import org.jooq.Converter; +import org.jooq.DataType; +import org.jooq.DatePart; +import org.jooq.Field; +import org.jooq.LikeEscapeStep; +import org.jooq.Name; +import org.jooq.QuantifiedSelect; +import org.jooq.QueryPartInternal; +import org.jooq.Record; +import org.jooq.Record1; +import org.jooq.RenderContext; +import org.jooq.Result; +import org.jooq.Select; +import org.jooq.SortField; +import org.jooq.SortOrder; +import org.jooq.WindowIgnoreNullsStep; +import org.jooq.WindowPartitionByStep; +import org.jooq.exception.DataAccessException; + +/** + * A {@link Field} that acts as another field, allowing for the proxied field to + * be replaced. + * + * @author Lukas Eder + */ +@SuppressWarnings("unchecked") +final class FieldProxy implements Field, QueryPartInternal { + + /** + * Generated UID + */ + private static final long serialVersionUID = 8311876498583467760L; + + AbstractField delegate; + char[] sql; + int position; + + FieldProxy(AbstractField delegate, char[] sql, int position) { + this.delegate = delegate; + this.sql = sql; + this.position = position; + } + + @Override + public final Converter getConverter() { + return delegate.getConverter(); + } + + @Override + public final String getName() { + return delegate.getName(); + } + + @Override + public final Binding getBinding() { + return delegate.getBinding(); + } + + @Override + public final Name getQualifiedName() { + return delegate.getQualifiedName(); + } + + @Override + public final void toSQL(RenderContext context) { + delegate.toSQL(context); + } + + @Override + public final Class getType() { + return delegate.getType(); + } + + @Override + public final DataType getDataType() { + return delegate.getDataType(); + } + + @Override + public final Name getUnqualifiedName() { + return delegate.getUnqualifiedName(); + } + + @Override + public final DataType getDataType(Configuration configuration) { + return delegate.getDataType(configuration); + } + + @Override + public final String getComment() { + return delegate.getComment(); + } + + @Override + public final int hashCode() { + return delegate.hashCode(); + } + + @Override + public final void bind(BindContext context) throws DataAccessException { + delegate.bind(context); + } + + @Override + public final boolean equals(Object that) { + return delegate.equals(that); + } + + @Override + public final boolean declaresFields() { + return delegate.declaresFields(); + } + + @Override + public final boolean declaresTables() { + return delegate.declaresTables(); + } + + @Override + public final boolean declaresWindows() { + return delegate.declaresWindows(); + } + + @Override + public final boolean declaresCTE() { + return delegate.declaresCTE(); + } + + @Override + public final boolean generatesCast() { + return delegate.generatesCast(); + } + + @Override + public final void accept(Context ctx) { + delegate.accept(ctx); + } + + @Override + public final Clause[] clauses(Context ctx) { + return delegate.clauses(ctx); + } + + @Override + public final Field field(Record record) { + return delegate.field(record); + } + + @Override + public final String toString() { + return delegate.toString(); + } + + @Override + public final T get(Record record) { + return delegate.get(record); + } + + @Override + public final T getValue(Record record) { + return delegate.getValue(record); + } + + @Override + public final T original(Record record) { + return delegate.original(record); + } + + @Override + public final boolean changed(Record record) { + return delegate.changed(record); + } + + @Override + public final void reset(Record record) { + delegate.reset(record); + } + + @Override + public final Record1 from(Record record) { + return delegate.from(record); + } + + @Override + public final Field as(String alias) { + return delegate.as(alias); + } + + @Override + public final Field as(Name alias) { + return delegate.as(alias); + } + + @Override + public final Field as(Field otherField) { + return delegate.as(otherField); + } + + @Override + public final Field as(Function, ? extends String> aliasFunction) { + return delegate.as(aliasFunction); + } + + @Override + public final Field cast(Field field) { + return delegate.cast(field); + } + + @Override + public final Field cast(DataType type) { + return delegate.cast(type); + } + + @Override + public final Field cast(Class type) { + return delegate.cast(type); + } + + @Override + public final Field coerce(Field field) { + return delegate.coerce(field); + } + + @Override + public final Field coerce(DataType type) { + return delegate.coerce(type); + } + + @Override + public final Field coerce(Class type) { + return delegate.coerce(type); + } + + @Override + public final SortField asc() { + return delegate.asc(); + } + + @Override + public final SortField desc() { + return delegate.desc(); + } + + @Override + public final SortField sortDefault() { + return delegate.sortDefault(); + } + + @Override + public final SortField sort(SortOrder order) { + return delegate.sort(order); + } + + @Override + public final SortField sortAsc(Collection sortList) { + return delegate.sortAsc(sortList); + } + + @Override + public final SortField sortAsc(T... sortList) { + return delegate.sortAsc(sortList); + } + + @Override + public final SortField sortDesc(Collection sortList) { + return delegate.sortDesc(sortList); + } + + @Override + public final SortField sortDesc(T... sortList) { + return delegate.sortDesc(sortList); + } + + @Override + public final SortField sort(Map sortMap) { + return delegate.sort(sortMap); + } + + @Override + public final Field neg() { + return delegate.neg(); + } + + @Override + public final Field unaryMinus() { + return delegate.unaryMinus(); + } + + @Override + public final Field unaryPlus() { + return delegate.unaryPlus(); + } + + @Override + public final Field add(Number value) { + return delegate.add(value); + } + + @Override + public final Field add(Field value) { + return delegate.add(value); + } + + @Override + public final Field sub(Number value) { + return delegate.sub(value); + } + + @Override + public final Field sub(Field value) { + return delegate.sub(value); + } + + @Override + public final Field mul(Number value) { + return delegate.mul(value); + } + + @Override + public final Field mul(Field value) { + return delegate.mul(value); + } + + @Override + public final Field div(Number value) { + return delegate.div(value); + } + + @Override + public final Field div(Field value) { + return delegate.div(value); + } + + @Override + public final Field mod(Number value) { + return delegate.mod(value); + } + + @Override + public final Field mod(Field value) { + return delegate.mod(value); + } + + @Override + public final Field plus(Number value) { + return delegate.plus(value); + } + + @Override + public final Field plus(Field value) { + return delegate.plus(value); + } + + @Override + public final Field subtract(Number value) { + return delegate.subtract(value); + } + + @Override + public final Field subtract(Field value) { + return delegate.subtract(value); + } + + @Override + public final Field minus(Number value) { + return delegate.minus(value); + } + + @Override + public final Field minus(Field value) { + return delegate.minus(value); + } + + @Override + public final Field multiply(Number value) { + return delegate.multiply(value); + } + + @Override + public final Field multiply(Field value) { + return delegate.multiply(value); + } + + @Override + public final Field times(Number value) { + return delegate.times(value); + } + + @Override + public final Field times(Field value) { + return delegate.times(value); + } + + @Override + public final Field divide(Number value) { + return delegate.divide(value); + } + + @Override + public final Field divide(Field value) { + return delegate.divide(value); + } + + @Override + public final Field modulo(Number value) { + return delegate.modulo(value); + } + + @Override + public final Field modulo(Field value) { + return delegate.modulo(value); + } + + @Override + public final Field rem(Number value) { + return delegate.rem(value); + } + + @Override + public final Field rem(Field value) { + return delegate.rem(value); + } + + @Override + public final Field bitNot() { + return delegate.bitNot(); + } + + @Override + public final Field bitAnd(T value) { + return delegate.bitAnd(value); + } + + @Override + public final Field bitAnd(Field value) { + return delegate.bitAnd(value); + } + + @Override + public final Field bitNand(T value) { + return delegate.bitNand(value); + } + + @Override + public final Field bitNand(Field value) { + return delegate.bitNand(value); + } + + @Override + public final Field bitOr(T value) { + return delegate.bitOr(value); + } + + @Override + public final Field bitOr(Field value) { + return delegate.bitOr(value); + } + + @Override + public final Field bitNor(T value) { + return delegate.bitNor(value); + } + + @Override + public final Field bitNor(Field value) { + return delegate.bitNor(value); + } + + @Override + public final Field bitXor(T value) { + return delegate.bitXor(value); + } + + @Override + public final Field bitXor(Field value) { + return delegate.bitXor(value); + } + + @Override + public final Field bitXNor(T value) { + return delegate.bitXNor(value); + } + + @Override + public final Field bitXNor(Field value) { + return delegate.bitXNor(value); + } + + @Override + public final Field shl(Number value) { + return delegate.shl(value); + } + + @Override + public final Field shl(Field value) { + return delegate.shl(value); + } + + @Override + public final Field shr(Number value) { + return delegate.shr(value); + } + + @Override + public final Field shr(Field value) { + return delegate.shr(value); + } + + @Override + public final Condition isDocument() { + return delegate.isDocument(); + } + + @Override + public final Condition isNotDocument() { + return delegate.isNotDocument(); + } + + @Override + public final Condition isJson() { + return delegate.isJson(); + } + + @Override + public final Condition isNotJson() { + return delegate.isNotJson(); + } + + @Override + public final Condition isNull() { + return delegate.isNull(); + } + + @Override + public final Condition isNotNull() { + return delegate.isNotNull(); + } + + @Override + public final Condition isDistinctFrom(T value) { + return delegate.isDistinctFrom(value); + } + + @Override + public final Condition isDistinctFrom(Field field) { + return delegate.isDistinctFrom(field); + } + + @Override + public final Condition isNotDistinctFrom(T value) { + return delegate.isNotDistinctFrom(value); + } + + @Override + public final Condition isNotDistinctFrom(Field field) { + return delegate.isNotDistinctFrom(field); + } + + @Override + public final Condition isTrue() { + return delegate.isTrue(); + } + + @Override + public final Condition isFalse() { + return delegate.isFalse(); + } + + @Override + public final LikeEscapeStep similarTo(String value) { + return delegate.similarTo(value); + } + + @Override + public final Condition similarTo(String value, char escape) { + return delegate.similarTo(value, escape); + } + + @Override + public final LikeEscapeStep similarTo(Field field) { + return delegate.similarTo(field); + } + + @Override + public final Condition similarTo(Field field, char escape) { + return delegate.similarTo(field, escape); + } + + @Override + public final LikeEscapeStep notSimilarTo(String value) { + return delegate.notSimilarTo(value); + } + + @Override + public final Condition notSimilarTo(String value, char escape) { + return delegate.notSimilarTo(value, escape); + } + + @Override + public final LikeEscapeStep notSimilarTo(Field field) { + return delegate.notSimilarTo(field); + } + + @Override + public final Condition notSimilarTo(Field field, char escape) { + return delegate.notSimilarTo(field, escape); + } + + @Override + public final LikeEscapeStep like(String value) { + return delegate.like(value); + } + + @Override + public final Condition like(String value, char escape) { + return delegate.like(value, escape); + } + + @Override + public final LikeEscapeStep like(Field field) { + return delegate.like(field); + } + + @Override + public final Condition like(Field field, char escape) { + return delegate.like(field, escape); + } + + @Override + public final LikeEscapeStep like(QuantifiedSelect> query) { + return delegate.like(query); + } + + @Override + public final LikeEscapeStep likeIgnoreCase(String value) { + return delegate.likeIgnoreCase(value); + } + + @Override + public final Condition likeIgnoreCase(String value, char escape) { + return delegate.likeIgnoreCase(value, escape); + } + + @Override + public final LikeEscapeStep likeIgnoreCase(Field field) { + return delegate.likeIgnoreCase(field); + } + + @Override + public final Condition likeIgnoreCase(Field field, char escape) { + return delegate.likeIgnoreCase(field, escape); + } + + @Override + public final Condition likeRegex(String pattern) { + return delegate.likeRegex(pattern); + } + + @Override + public final Condition likeRegex(Field pattern) { + return delegate.likeRegex(pattern); + } + + @Override + public final LikeEscapeStep notLike(String value) { + return delegate.notLike(value); + } + + @Override + public final Condition notLike(String value, char escape) { + return delegate.notLike(value, escape); + } + + @Override + public final LikeEscapeStep notLike(Field field) { + return delegate.notLike(field); + } + + @Override + public final Condition notLike(Field field, char escape) { + return delegate.notLike(field, escape); + } + + @Override + public final LikeEscapeStep notLike(QuantifiedSelect> query) { + return delegate.notLike(query); + } + + @Override + public final LikeEscapeStep notLikeIgnoreCase(String value) { + return delegate.notLikeIgnoreCase(value); + } + + @Override + public final Condition notLikeIgnoreCase(String value, char escape) { + return delegate.notLikeIgnoreCase(value, escape); + } + + @Override + public final LikeEscapeStep notLikeIgnoreCase(Field field) { + return delegate.notLikeIgnoreCase(field); + } + + @Override + public final Condition notLikeIgnoreCase(Field field, char escape) { + return delegate.notLikeIgnoreCase(field, escape); + } + + @Override + public final Condition notLikeRegex(String pattern) { + return delegate.notLikeRegex(pattern); + } + + @Override + public final Condition notLikeRegex(Field pattern) { + return delegate.notLikeRegex(pattern); + } + + @Override + public final Condition contains(T value) { + return delegate.contains(value); + } + + @Override + public final Condition contains(Field value) { + return delegate.contains(value); + } + + @Override + public final Condition notContains(T value) { + return delegate.notContains(value); + } + + @Override + public final Condition notContains(Field value) { + return delegate.notContains(value); + } + + @Override + public final Condition containsIgnoreCase(T value) { + return delegate.containsIgnoreCase(value); + } + + @Override + public final Condition containsIgnoreCase(Field value) { + return delegate.containsIgnoreCase(value); + } + + @Override + public final Condition notContainsIgnoreCase(T value) { + return delegate.notContainsIgnoreCase(value); + } + + @Override + public final Condition notContainsIgnoreCase(Field value) { + return delegate.notContainsIgnoreCase(value); + } + + @Override + public final Condition startsWith(T value) { + return delegate.startsWith(value); + } + + @Override + public final Condition startsWith(Field value) { + return delegate.startsWith(value); + } + + @Override + public final Condition startsWithIgnoreCase(T value) { + return delegate.startsWithIgnoreCase(value); + } + + @Override + public final Condition startsWithIgnoreCase(Field value) { + return delegate.startsWithIgnoreCase(value); + } + + @Override + public final Condition endsWith(T value) { + return delegate.endsWith(value); + } + + @Override + public final Condition endsWith(Field value) { + return delegate.endsWith(value); + } + + @Override + public final Condition endsWithIgnoreCase(T value) { + return delegate.endsWithIgnoreCase(value); + } + + @Override + public final Condition endsWithIgnoreCase(Field value) { + return delegate.endsWithIgnoreCase(value); + } + + @Override + public final Condition in(T... values) { + return delegate.in(values); + } + + @Override + public final Condition in(Field... values) { + return delegate.in(values); + } + + @Override + public final Condition in(Collection values) { + return delegate.in(values); + } + + @Override + public final Condition in(Result> result) { + return delegate.in(result); + } + + @Override + public final Condition in(Select> query) { + return delegate.in(query); + } + + @Override + public final Condition notIn(T... values) { + return delegate.notIn(values); + } + + @Override + public final Condition notIn(Field... values) { + return delegate.notIn(values); + } + + @Override + public final Condition notIn(Collection values) { + return delegate.notIn(values); + } + + @Override + public final Condition notIn(Result> result) { + return delegate.notIn(result); + } + + @Override + public final Condition notIn(Select> query) { + return delegate.notIn(query); + } + + @Override + public final Condition between(T minValue, T maxValue) { + return delegate.between(minValue, maxValue); + } + + @Override + public final Condition between(Field minValue, Field maxValue) { + return delegate.between(minValue, maxValue); + } + + @Override + public final Condition betweenSymmetric(T minValue, T maxValue) { + return delegate.betweenSymmetric(minValue, maxValue); + } + + @Override + public final Condition betweenSymmetric(Field minValue, Field maxValue) { + return delegate.betweenSymmetric(minValue, maxValue); + } + + @Override + public final Condition notBetween(T minValue, T maxValue) { + return delegate.notBetween(minValue, maxValue); + } + + @Override + public final Condition notBetween(Field minValue, Field maxValue) { + return delegate.notBetween(minValue, maxValue); + } + + @Override + public final Condition notBetweenSymmetric(T minValue, T maxValue) { + return delegate.notBetweenSymmetric(minValue, maxValue); + } + + @Override + public final Condition notBetweenSymmetric(Field minValue, Field maxValue) { + return delegate.notBetweenSymmetric(minValue, maxValue); + } + + @Override + public final BetweenAndStep between(T minValue) { + return delegate.between(minValue); + } + + @Override + public final BetweenAndStep between(Field minValue) { + return delegate.between(minValue); + } + + @Override + public final BetweenAndStep betweenSymmetric(T minValue) { + return delegate.betweenSymmetric(minValue); + } + + @Override + public final BetweenAndStep betweenSymmetric(Field minValue) { + return delegate.betweenSymmetric(minValue); + } + + @Override + public final BetweenAndStep notBetween(T minValue) { + return delegate.notBetween(minValue); + } + + @Override + public final BetweenAndStep notBetween(Field minValue) { + return delegate.notBetween(minValue); + } + + @Override + public final BetweenAndStep notBetweenSymmetric(T minValue) { + return delegate.notBetweenSymmetric(minValue); + } + + @Override + public final BetweenAndStep notBetweenSymmetric(Field minValue) { + return delegate.notBetweenSymmetric(minValue); + } + + @Override + public final Condition eq(T value) { + return delegate.eq(value); + } + + @Override + public final Condition eq(Field field) { + return delegate.eq(field); + } + + @Override + public final Condition eq(Select> query) { + return delegate.eq(query); + } + + @Override + public final Condition eq(QuantifiedSelect> query) { + return delegate.eq(query); + } + + @Override + public final Condition ne(T value) { + return delegate.ne(value); + } + + @Override + public final Condition ne(Field field) { + return delegate.ne(field); + } + + @Override + public final Condition ne(Select> query) { + return delegate.ne(query); + } + + @Override + public final Condition ne(QuantifiedSelect> query) { + return delegate.ne(query); + } + + @Override + public final Condition lt(T value) { + return delegate.lt(value); + } + + @Override + public final Condition lt(Field field) { + return delegate.lt(field); + } + + @Override + public final Condition lt(Select> query) { + return delegate.lt(query); + } + + @Override + public final Condition lt(QuantifiedSelect> query) { + return delegate.lt(query); + } + + @Override + public final Condition le(T value) { + return delegate.le(value); + } + + @Override + public final Condition le(Field field) { + return delegate.le(field); + } + + @Override + public final Condition le(Select> query) { + return delegate.le(query); + } + + @Override + public final Condition le(QuantifiedSelect> query) { + return delegate.le(query); + } + + @Override + public final Condition gt(T value) { + return delegate.gt(value); + } + + @Override + public final Condition gt(Field field) { + return delegate.gt(field); + } + + @Override + public final Condition gt(Select> query) { + return delegate.gt(query); + } + + @Override + public final Condition gt(QuantifiedSelect> query) { + return delegate.gt(query); + } + + @Override + public final Condition ge(T value) { + return delegate.ge(value); + } + + @Override + public final Condition ge(Field field) { + return delegate.ge(field); + } + + @Override + public final Condition ge(Select> query) { + return delegate.ge(query); + } + + @Override + public final Condition ge(QuantifiedSelect> query) { + return delegate.ge(query); + } + + @Override + public final Condition equal(T value) { + return delegate.equal(value); + } + + @Override + public final Condition equal(Field field) { + return delegate.equal(field); + } + + @Override + public final Condition equalIgnoreCase(String value) { + return delegate.equalIgnoreCase(value); + } + + @Override + public final Condition equalIgnoreCase(Field value) { + return delegate.equalIgnoreCase(value); + } + + @Override + public final Condition equal(Select> query) { + return delegate.equal(query); + } + + @Override + public final Condition equal(QuantifiedSelect> query) { + return delegate.equal(query); + } + + @Override + public final Condition notEqual(T value) { + return delegate.notEqual(value); + } + + @Override + public final Condition notEqual(Field field) { + return delegate.notEqual(field); + } + + @Override + public final Condition notEqualIgnoreCase(String value) { + return delegate.notEqualIgnoreCase(value); + } + + @Override + public final Condition notEqualIgnoreCase(Field value) { + return delegate.notEqualIgnoreCase(value); + } + + @Override + public final Condition notEqual(Select> query) { + return delegate.notEqual(query); + } + + @Override + public final Condition notEqual(QuantifiedSelect> query) { + return delegate.notEqual(query); + } + + @Override + public final Condition lessThan(T value) { + return delegate.lessThan(value); + } + + @Override + public final Condition lessThan(Field field) { + return delegate.lessThan(field); + } + + @Override + public final Condition lessThan(Select> query) { + return delegate.lessThan(query); + } + + @Override + public final Condition lessThan(QuantifiedSelect> query) { + return delegate.lessThan(query); + } + + @Override + public final Condition lessOrEqual(T value) { + return delegate.lessOrEqual(value); + } + + @Override + public final Condition lessOrEqual(Field field) { + return delegate.lessOrEqual(field); + } + + @Override + public final Condition lessOrEqual(Select> query) { + return delegate.lessOrEqual(query); + } + + @Override + public final Condition lessOrEqual(QuantifiedSelect> query) { + return delegate.lessOrEqual(query); + } + + @Override + public final Condition greaterThan(T value) { + return delegate.greaterThan(value); + } + + @Override + public final Condition greaterThan(Field field) { + return delegate.greaterThan(field); + } + + @Override + public final Condition greaterThan(Select> query) { + return delegate.greaterThan(query); + } + + @Override + public final Condition greaterThan(QuantifiedSelect> query) { + return delegate.greaterThan(query); + } + + @Override + public final Condition greaterOrEqual(T value) { + return delegate.greaterOrEqual(value); + } + + @Override + public final Condition greaterOrEqual(Field field) { + return delegate.greaterOrEqual(field); + } + + @Override + public final Condition greaterOrEqual(Select> query) { + return delegate.greaterOrEqual(query); + } + + @Override + public final Condition greaterOrEqual(QuantifiedSelect> query) { + return delegate.greaterOrEqual(query); + } + + @Override + public final Condition compare(Comparator comparator, T value) { + return delegate.compare(comparator, value); + } + + @Override + public final Condition compare(Comparator comparator, Field field) { + return delegate.compare(comparator, field); + } + + @Override + public final Condition compare(Comparator comparator, Select> query) { + return delegate.compare(comparator, query); + } + + @Override + public final Condition compare(Comparator comparator, QuantifiedSelect> query) { + return delegate.compare(comparator, query); + } + + @Override + public final Field plus() { + return delegate.plus(); + } + + @Override + public final Field sign() { + return delegate.sign(); + } + + @Override + public final Field abs() { + return delegate.abs(); + } + + @Override + public final Field round() { + return delegate.round(); + } + + @Override + public final Field round(int decimals) { + return delegate.round(decimals); + } + + @Override + public final Field floor() { + return delegate.floor(); + } + + @Override + public final Field ceil() { + return delegate.ceil(); + } + + @Override + public final Field sqrt() { + return delegate.sqrt(); + } + + @Override + public final Field exp() { + return delegate.exp(); + } + + @Override + public final Field ln() { + return delegate.ln(); + } + + @Override + public final Field log(int base) { + return delegate.log(base); + } + + @Override + public final Field pow(Number exponent) { + return delegate.pow(exponent); + } + + @Override + public final Field power(Number exponent) { + return delegate.power(exponent); + } + + @Override + public final Field pow(Field exponent) { + return delegate.pow(exponent); + } + + @Override + public final Field power(Field exponent) { + return delegate.power(exponent); + } + + @Override + public final Field acos() { + return delegate.acos(); + } + + @Override + public final Field asin() { + return delegate.asin(); + } + + @Override + public final Field atan() { + return delegate.atan(); + } + + @Override + public final Field atan2(Number y) { + return delegate.atan2(y); + } + + @Override + public final Field atan2(Field y) { + return delegate.atan2(y); + } + + @Override + public final Field cos() { + return delegate.cos(); + } + + @Override + public final Field sin() { + return delegate.sin(); + } + + @Override + public final Field tan() { + return delegate.tan(); + } + + @Override + public final Field cot() { + return delegate.cot(); + } + + @Override + public final Field sinh() { + return delegate.sinh(); + } + + @Override + public final Field cosh() { + return delegate.cosh(); + } + + @Override + public final Field tanh() { + return delegate.tanh(); + } + + @Override + public final Field coth() { + return delegate.coth(); + } + + @Override + public final Field deg() { + return delegate.deg(); + } + + @Override + public final Field rad() { + return delegate.rad(); + } + + @Override + public final Field count() { + return delegate.count(); + } + + @Override + public final Field countDistinct() { + return delegate.countDistinct(); + } + + @Override + public final Field max() { + return delegate.max(); + } + + @Override + public final Field min() { + return delegate.min(); + } + + @Override + public final Field sum() { + return delegate.sum(); + } + + @Override + public final Field avg() { + return delegate.avg(); + } + + @Override + public final Field median() { + return delegate.median(); + } + + @Override + public final Field stddevPop() { + return delegate.stddevPop(); + } + + @Override + public final Field stddevSamp() { + return delegate.stddevSamp(); + } + + @Override + public final Field varPop() { + return delegate.varPop(); + } + + @Override + public final Field varSamp() { + return delegate.varSamp(); + } + + @Override + public final WindowPartitionByStep countOver() { + return delegate.countOver(); + } + + @Override + public final WindowPartitionByStep maxOver() { + return delegate.maxOver(); + } + + @Override + public final WindowPartitionByStep minOver() { + return delegate.minOver(); + } + + @Override + public final WindowPartitionByStep sumOver() { + return delegate.sumOver(); + } + + @Override + public final WindowPartitionByStep avgOver() { + return delegate.avgOver(); + } + + @Override + public final WindowIgnoreNullsStep firstValue() { + return delegate.firstValue(); + } + + @Override + public final WindowIgnoreNullsStep lastValue() { + return delegate.lastValue(); + } + + @Override + public final WindowIgnoreNullsStep lead() { + return delegate.lead(); + } + + @Override + public final WindowIgnoreNullsStep lead(int offset) { + return delegate.lead(offset); + } + + @Override + public final WindowIgnoreNullsStep lead(int offset, T defaultValue) { + return delegate.lead(offset, defaultValue); + } + + @Override + public final WindowIgnoreNullsStep lead(int offset, Field defaultValue) { + return delegate.lead(offset, defaultValue); + } + + @Override + public final WindowIgnoreNullsStep lag() { + return delegate.lag(); + } + + @Override + public final WindowIgnoreNullsStep lag(int offset) { + return delegate.lag(offset); + } + + @Override + public final WindowIgnoreNullsStep lag(int offset, T defaultValue) { + return delegate.lag(offset, defaultValue); + } + + @Override + public final WindowIgnoreNullsStep lag(int offset, Field defaultValue) { + return delegate.lag(offset, defaultValue); + } + + @Override + public final WindowPartitionByStep stddevPopOver() { + return delegate.stddevPopOver(); + } + + @Override + public final WindowPartitionByStep stddevSampOver() { + return delegate.stddevSampOver(); + } + + @Override + public final WindowPartitionByStep varPopOver() { + return delegate.varPopOver(); + } + + @Override + public final WindowPartitionByStep varSampOver() { + return delegate.varSampOver(); + } + + @Override + public final Field upper() { + return delegate.upper(); + } + + @Override + public final Field lower() { + return delegate.lower(); + } + + @Override + public final Field trim() { + return delegate.trim(); + } + + @Override + public final Field rtrim() { + return delegate.rtrim(); + } + + @Override + public final Field ltrim() { + return delegate.ltrim(); + } + + @Override + public final Field rpad(Field length) { + return delegate.rpad(length); + } + + @Override + public final Field rpad(int length) { + return delegate.rpad(length); + } + + @Override + public final Field rpad(Field length, Field character) { + return delegate.rpad(length, character); + } + + @Override + public final Field rpad(int length, char character) { + return delegate.rpad(length, character); + } + + @Override + public final Field lpad(Field length) { + return delegate.lpad(length); + } + + @Override + public final Field lpad(int length) { + return delegate.lpad(length); + } + + @Override + public final Field lpad(Field length, Field character) { + return delegate.lpad(length, character); + } + + @Override + public final Field lpad(int length, char character) { + return delegate.lpad(length, character); + } + + @Override + public final Field repeat(Number count) { + return delegate.repeat(count); + } + + @Override + public final Field repeat(Field count) { + return delegate.repeat(count); + } + + @Override + public final Field replace(Field search) { + return delegate.replace(search); + } + + @Override + public final Field replace(String search) { + return delegate.replace(search); + } + + @Override + public final Field replace(Field search, Field replace) { + return delegate.replace(search, replace); + } + + @Override + public final Field replace(String search, String replace) { + return delegate.replace(search, replace); + } + + @Override + public final Field position(String search) { + return delegate.position(search); + } + + @Override + public final Field position(Field search) { + return delegate.position(search); + } + + @Override + public final Field ascii() { + return delegate.ascii(); + } + + @Override + public final Field collate(String collation) { + return delegate.collate(collation); + } + + @Override + public final Field collate(Name collation) { + return delegate.collate(collation); + } + + @Override + public final Field collate(Collation collation) { + return delegate.collate(collation); + } + + @Override + public final Field concat(Field... fields) { + return delegate.concat(fields); + } + + @Override + public final Field concat(String... values) { + return delegate.concat(values); + } + + @Override + public final Field concat(char... values) { + return delegate.concat(values); + } + + @Override + public final Field substring(int startingPosition) { + return delegate.substring(startingPosition); + } + + @Override + public final Field substring(Field startingPosition) { + return delegate.substring(startingPosition); + } + + @Override + public final Field substring(int startingPosition, int length) { + return delegate.substring(startingPosition, length); + } + + @Override + public final Field substring(Field startingPosition, Field length) { + return delegate.substring(startingPosition, length); + } + + @Override + public final Field length() { + return delegate.length(); + } + + @Override + public final Field charLength() { + return delegate.charLength(); + } + + @Override + public final Field bitLength() { + return delegate.bitLength(); + } + + @Override + public final Field octetLength() { + return delegate.octetLength(); + } + + @Override + public final Field extract(DatePart datePart) { + return delegate.extract(datePart); + } + + @Override + public final Field greatest(T... others) { + return delegate.greatest(others); + } + + @Override + public final Field greatest(Field... others) { + return delegate.greatest(others); + } + + @Override + public final Field least(T... others) { + return delegate.least(others); + } + + @Override + public final Field least(Field... others) { + return delegate.least(others); + } + + @Override + public final Field nvl(T defaultValue) { + return delegate.nvl(defaultValue); + } + + @Override + public final Field nvl(Field defaultValue) { + return delegate.nvl(defaultValue); + } + + @Override + public final Field nvl2(Z valueIfNotNull, Z valueIfNull) { + return delegate.nvl2(valueIfNotNull, valueIfNull); + } + + @Override + public final Field nvl2(Field valueIfNotNull, Field valueIfNull) { + return delegate.nvl2(valueIfNotNull, valueIfNull); + } + + @Override + public final Field nullif(T other) { + return delegate.nullif(other); + } + + @Override + public final Field nullif(Field other) { + return delegate.nullif(other); + } + + @Override + public final Field decode(T search, Z result) { + return delegate.decode(search, result); + } + + @Override + public final Field decode(T search, Z result, Object... more) { + return delegate.decode(search, result, more); + } + + @Override + public final Field decode(Field search, Field result) { + return delegate.decode(search, result); + } + + @Override + public final Field decode(Field search, Field result, Field... more) { + return delegate.decode(search, result, more); + } + + @Override + public final Field coalesce(T option, T... options) { + return delegate.coalesce(option, options); + } + + @Override + public final Field coalesce(Field option, Field... options) { + return delegate.coalesce(option, options); + } +} \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 686f80f866..b9948cb45b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -873,6 +873,7 @@ final class ParserImpl implements Parser { if (ctx.done()) return null; + ctx.scopeStart(); boolean metaLookupsForceIgnore = ctx.metaLookupsForceIgnore(); try { switch (ctx.character()) { @@ -1002,7 +1003,15 @@ final class ParserImpl implements Parser { throw ctx.exception("Unsupported query type"); } + catch (ParserException e) { + + // [#9061] Don't hide this pre-existing exceptions in scopeResolve() + ctx.scopeClear(); + throw e; + } finally { + ctx.scopeEnd(); + ctx.scopeResolve(); ctx.metaLookupsForceIgnore(metaLookupsForceIgnore); } } @@ -1085,6 +1094,7 @@ final class ParserImpl implements Parser { } private static final SelectQueryImpl parseSelect(ParserContext ctx, Integer degree, WithImpl with) { + ctx.scopeStart(); SelectQueryImpl result = parseQueryExpressionBody(ctx, degree, with, null); List> orderBy = null; @@ -1213,6 +1223,7 @@ final class ParserImpl implements Parser { result.setForUpdateSkipLocked(); } + ctx.scopeEnd(); return result; } @@ -1422,6 +1433,12 @@ final class ParserImpl implements Parser { if (from != null && from.size() == 1 && from.get(0).getName().equalsIgnoreCase("dual")) from = null; + // [#9061] Register tables in scope as early as possible + // TODO: Move this into parseTables() so lateral joins can profit from lookups (?) + if (from != null) + for (Table table : from) + ctx.tableScope.set(table.getName(), table); + if (parseKeywordIf(ctx, "WHERE")) where = parseCondition(ctx); @@ -11580,19 +11597,22 @@ final class ParserImpl implements Parser { } final class ParserContext { - private static final boolean PRO_EDITION = false ; + private static final boolean PRO_EDITION = false ; - final DSLContext dsl; - final Locale locale; - final Meta meta; - final char[] sql; - private final ParseWithMetaLookups metaLookups; - private boolean metaLookupsForceIgnore; - private int position = 0; - private boolean ignoreHints = true; - private final Object[] bindings; - private int bindIndex = 0; - private String delimiter = ";"; + final DSLContext dsl; + final Locale locale; + final Meta meta; + final char[] sql; + private final ParseWithMetaLookups metaLookups; + private boolean metaLookupsForceIgnore; + private int position = 0; + private boolean ignoreHints = true; + private final Object[] bindings; + private int bindIndex = 0; + private String delimiter = ";"; + final ScopeStack> tableScope = new ScopeStack<>(null); + final ScopeStack> lookupFields = new ScopeStack<>(null); + private boolean scopeClear = false; @@ -11860,6 +11880,66 @@ final class ParserContext { + (sql.length > position + 80 ? "..." : ""); } + void scopeStart() { + tableScope.scopeStart(); + lookupFields.scopeStart(); + lookupFields.setAll(null); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + void scopeEnd() { + List> retain = new ArrayList<>(); + + for (FieldProxy f : lookupFields) { + Field f1 = null; + + for (Table t : tableScope) { + Field f2; + if ((f2 = t.field(f.getName())) != null) { + if (f1 != null) { + position(f.position); + throw exception("Ambiguous field identifier"); + } + + f1 = f2; + } + } + + if (f1 != null) { + f.delegate = (AbstractField) f1; + f.sql = null; + } + else + retain.add(f); + } + + lookupFields.scopeEnd(); + tableScope.scopeEnd(); + + for (FieldProxy r : retain) + if (lookupFields.get(r.getName()) == null) + if (lookupFields.inScope()) + lookupFields.set(r.getName(), r); + else + unknownField(r); + } + + void scopeClear() { + scopeClear = true; + } + + void scopeResolve() { + if (!lookupFields.isEmpty()) + unknownField(lookupFields.iterator().next()); + } + + void unknownField(FieldProxy field) { + if (!scopeClear && !metaLookupsForceIgnore && metaLookups == THROW_ON_FAILURE) { + position(field.position); + throw exception("Unknown field identifier"); + } + } + Table lookupTable(Name name) { if (meta != null) { List> tables; @@ -11896,10 +11976,14 @@ final class ParserContext { } } - if (!metaLookupsForceIgnore && metaLookups == THROW_ON_FAILURE) - throw exception("Unknown field identifier"); + if (metaLookups == ParseWithMetaLookups.OFF) + return field(name); - return field(name); + FieldProxy field = lookupFields.get(name.last()); + if (field == null) + lookupFields.set(name.last(), field = new FieldProxy<>((AbstractField) field(name), sql, position)); + + return field; } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/ScopeStack.java b/jOOQ/src/main/java/org/jooq/impl/ScopeStack.java index 533549fcc4..a293a8e1b8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ScopeStack.java +++ b/jOOQ/src/main/java/org/jooq/impl/ScopeStack.java @@ -89,6 +89,11 @@ final class ScopeStack implements Iterable { } } } + + final boolean isEmpty() { + return !iterator().hasNext(); + } + @Override public final Iterator iterator() { return new Iterator() { @@ -132,6 +137,11 @@ final class ScopeStack implements Iterable { }; } + final void setAll(V value) { + for (K key : stack().keySet()) + set(key, value); + } + final void set(K key, V value) { set0(list(key), value); } @@ -194,4 +204,9 @@ final class ScopeStack implements Iterable { interface Constructor { V create(int scopeLevel); } + + @Override + public String toString() { + return stack().toString(); + } }