Fix literal related test issues
This commit is contained in:
parent
0f3548d586
commit
09abefefc1
|
@ -45,7 +45,6 @@ import org.hibernate.query.TypedParameterValue;
|
||||||
import org.hibernate.query.criteria.JpaExpression;
|
import org.hibernate.query.criteria.JpaExpression;
|
||||||
import org.hibernate.query.internal.QueryOptionsImpl;
|
import org.hibernate.query.internal.QueryOptionsImpl;
|
||||||
import org.hibernate.query.sqm.SqmExpressible;
|
import org.hibernate.query.sqm.SqmExpressible;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmHqlNumericLiteral;
|
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmLiteral;
|
import org.hibernate.query.sqm.tree.expression.SqmLiteral;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmParameter;
|
import org.hibernate.query.sqm.tree.expression.SqmParameter;
|
||||||
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
|
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
|
||||||
|
@ -133,10 +132,6 @@ public abstract class AbstractCommonQueryContract implements CommonQueryContract
|
||||||
if ( expression instanceof SqmLiteral<?> ) {
|
if ( expression instanceof SqmLiteral<?> ) {
|
||||||
fetchValue = ( (SqmLiteral<Number>) expression ).getLiteralValue();
|
fetchValue = ( (SqmLiteral<Number>) expression ).getLiteralValue();
|
||||||
}
|
}
|
||||||
else if ( expression instanceof SqmHqlNumericLiteral ) {
|
|
||||||
final SqmHqlNumericLiteral<Number> hqlNumericLiteral = (SqmHqlNumericLiteral<Number>) expression;
|
|
||||||
fetchValue = hqlNumericLiteral.getTypeCategory().parseLiteralValue( hqlNumericLiteral.getLiteralValue() );
|
|
||||||
}
|
|
||||||
else if ( expression instanceof SqmParameter<?> ) {
|
else if ( expression instanceof SqmParameter<?> ) {
|
||||||
fetchValue = getParameterValue( (Parameter<Number>) expression );
|
fetchValue = getParameterValue( (Parameter<Number>) expression );
|
||||||
if ( fetchValue == null ) {
|
if ( fetchValue == null ) {
|
||||||
|
|
|
@ -5525,7 +5525,11 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
return handleConvertedUnparsedNumericLiteral( numericLiteral, expressible );
|
return handleConvertedUnparsedNumericLiteral( numericLiteral, expressible );
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UnparsedNumericLiteral<>( numericLiteral.getLiteralValue(), jdbcMapping );
|
return new UnparsedNumericLiteral<>(
|
||||||
|
numericLiteral.getUnparsedLiteralValue(),
|
||||||
|
numericLiteral.getTypeCategory(),
|
||||||
|
jdbcMapping
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <N extends Number> Expression handleConvertedUnparsedNumericLiteral(
|
private <N extends Number> Expression handleConvertedUnparsedNumericLiteral(
|
||||||
|
@ -5535,7 +5539,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
final BasicValueConverter valueConverter = expressible.getJdbcMapping().getValueConverter();
|
final BasicValueConverter valueConverter = expressible.getJdbcMapping().getValueConverter();
|
||||||
assert valueConverter != null;
|
assert valueConverter != null;
|
||||||
|
|
||||||
final Number parsedValue = numericLiteral.getTypeCategory().parseLiteralValue( numericLiteral.getLiteralValue() );
|
final Number parsedValue = numericLiteral.getTypeCategory().parseLiteralValue( numericLiteral.getUnparsedLiteralValue() );
|
||||||
final Object sqlLiteralValue;
|
final Object sqlLiteralValue;
|
||||||
if ( valueConverter.getDomainJavaType().isInstance( parsedValue ) ) {
|
if ( valueConverter.getDomainJavaType().isInstance( parsedValue ) ) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
|
@ -6663,7 +6667,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
//TODO: do we need to temporarily set appliedByUnit
|
//TODO: do we need to temporarily set appliedByUnit
|
||||||
// to null before we recurse down the tree?
|
// to null before we recurse down the tree?
|
||||||
// and what about scale?
|
// and what about scale?
|
||||||
|
inferrableTypeAccessStack.push( () -> null );
|
||||||
Expression magnitude = toSqlExpression( toDuration.getMagnitude().accept( this ) );
|
Expression magnitude = toSqlExpression( toDuration.getMagnitude().accept( this ) );
|
||||||
|
inferrableTypeAccessStack.pop();
|
||||||
DurationUnit unit = (DurationUnit) toDuration.getUnit().accept( this );
|
DurationUnit unit = (DurationUnit) toDuration.getUnit().accept( this );
|
||||||
|
|
||||||
// let's start by applying the propagated scale
|
// let's start by applying the propagated scale
|
||||||
|
|
|
@ -31,7 +31,7 @@ import org.hibernate.type.descriptor.java.JavaType;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class SqmHqlNumericLiteral<N extends Number> extends AbstractSqmExpression<N> {
|
public class SqmHqlNumericLiteral<N extends Number> extends SqmLiteral<N> {
|
||||||
private final String literalValue;
|
private final String literalValue;
|
||||||
private final NumericTypeCategory typeCategory;
|
private final NumericTypeCategory typeCategory;
|
||||||
|
|
||||||
|
@ -52,10 +52,15 @@ public class SqmHqlNumericLiteral<N extends Number> extends AbstractSqmExpressio
|
||||||
this.typeCategory = typeCategory;
|
this.typeCategory = typeCategory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLiteralValue() {
|
public String getUnparsedLiteralValue() {
|
||||||
return literalValue;
|
return literalValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public N getLiteralValue() {
|
||||||
|
return typeCategory.parseLiteralValue( literalValue );
|
||||||
|
}
|
||||||
|
|
||||||
public NumericTypeCategory getTypeCategory() {
|
public NumericTypeCategory getTypeCategory() {
|
||||||
return typeCategory;
|
return typeCategory;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,12 +67,12 @@ public class SqmLiteral<T> extends AbstractSqmExpression<T> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String asLoggableText() {
|
public String asLoggableText() {
|
||||||
return "Literal( " + value + ")";
|
return "Literal( " + getLiteralValue() + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void appendHqlString(StringBuilder sb) {
|
public void appendHqlString(StringBuilder sb) {
|
||||||
appendHqlString( sb, getJavaTypeDescriptor(), value );
|
appendHqlString( sb, getJavaTypeDescriptor(), getLiteralValue() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> void appendHqlString(StringBuilder sb, JavaType<T> javaType, T value) {
|
public static <T> void appendHqlString(StringBuilder sb, JavaType<T> javaType, T value) {
|
||||||
|
|
|
@ -6678,7 +6678,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <N extends Number> void visitUnparsedNumericLiteral(UnparsedNumericLiteral<N> literal) {
|
public <N extends Number> void visitUnparsedNumericLiteral(UnparsedNumericLiteral<N> literal) {
|
||||||
appendSql( literal.getLiteralValue() );
|
appendSql( literal.getUnparsedLiteralValue() );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void visitLiteral(Literal literal) {
|
private void visitLiteral(Literal literal) {
|
||||||
|
|
|
@ -6,12 +6,18 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.sql.ast.tree.expression;
|
package org.hibernate.sql.ast.tree.expression;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
import org.hibernate.metamodel.mapping.JdbcMapping;
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
|
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
|
||||||
import org.hibernate.query.sqm.sql.internal.DomainResultProducer;
|
import org.hibernate.query.sqm.sql.internal.DomainResultProducer;
|
||||||
|
import org.hibernate.query.sqm.tree.expression.NumericTypeCategory;
|
||||||
import org.hibernate.sql.ast.SqlAstWalker;
|
import org.hibernate.sql.ast.SqlAstWalker;
|
||||||
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
|
||||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||||
|
import org.hibernate.sql.exec.spi.ExecutionContext;
|
||||||
|
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
|
||||||
import org.hibernate.sql.results.graph.DomainResult;
|
import org.hibernate.sql.results.graph.DomainResult;
|
||||||
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
import org.hibernate.sql.results.graph.DomainResultCreationState;
|
||||||
import org.hibernate.sql.results.graph.basic.BasicResult;
|
import org.hibernate.sql.results.graph.basic.BasicResult;
|
||||||
|
@ -24,16 +30,38 @@ import org.hibernate.type.spi.TypeConfiguration;
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class UnparsedNumericLiteral<N extends Number> implements Expression, DomainResultProducer<N> {
|
public class UnparsedNumericLiteral<N extends Number> implements Literal, DomainResultProducer<N> {
|
||||||
private final String literalValue;
|
private final String literalValue;
|
||||||
|
private final NumericTypeCategory typeCategory;
|
||||||
private final JdbcMapping jdbcMapping;
|
private final JdbcMapping jdbcMapping;
|
||||||
|
|
||||||
public UnparsedNumericLiteral(String literalValue, JdbcMapping jdbcMapping) {
|
public UnparsedNumericLiteral(String literalValue, NumericTypeCategory typeCategory, JdbcMapping jdbcMapping) {
|
||||||
this.literalValue = literalValue;
|
this.literalValue = literalValue;
|
||||||
|
this.typeCategory = typeCategory;
|
||||||
this.jdbcMapping = jdbcMapping;
|
this.jdbcMapping = jdbcMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLiteralValue() {
|
@Override
|
||||||
|
public N getLiteralValue() {
|
||||||
|
return typeCategory.parseLiteralValue( literalValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bindParameterValue(
|
||||||
|
PreparedStatement statement,
|
||||||
|
int startPosition,
|
||||||
|
JdbcParameterBindings jdbcParameterBindings,
|
||||||
|
ExecutionContext executionContext) throws SQLException {
|
||||||
|
//noinspection unchecked
|
||||||
|
jdbcMapping.getJdbcValueBinder().bind(
|
||||||
|
statement,
|
||||||
|
getLiteralValue(),
|
||||||
|
startPosition,
|
||||||
|
executionContext.getSession()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUnparsedLiteralValue() {
|
||||||
return literalValue;
|
return literalValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@ import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.query.sqm.tree.domain.SqmPath;
|
import org.hibernate.query.sqm.tree.domain.SqmPath;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmCollectionSize;
|
import org.hibernate.query.sqm.tree.expression.SqmCollectionSize;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmHqlNumericLiteral;
|
import org.hibernate.query.sqm.tree.expression.SqmHqlNumericLiteral;
|
||||||
import org.hibernate.query.sqm.tree.expression.SqmLiteral;
|
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmNullnessPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmNullnessPredicate;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
|
@ -82,7 +81,7 @@ public class WhereClauseTests extends BaseSqmUnitTest {
|
||||||
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.EQUAL ) );
|
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.EQUAL ) );
|
||||||
|
|
||||||
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmHqlNumericLiteral.class ) );
|
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmHqlNumericLiteral.class ) );
|
||||||
assertThat( ( (SqmHqlNumericLiteral<?>) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( "311" ) );
|
assertThat( ( (SqmHqlNumericLiteral<?>) relationalPredicate.getRightHandExpression() ).getUnparsedLiteralValue(), is( "311" ) );
|
||||||
|
|
||||||
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmCollectionSize.class ) );
|
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmCollectionSize.class ) );
|
||||||
|
|
||||||
|
@ -102,7 +101,7 @@ public class WhereClauseTests extends BaseSqmUnitTest {
|
||||||
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.GREATER_THAN ) );
|
assertThat( relationalPredicate.getSqmOperator(), is( ComparisonOperator.GREATER_THAN ) );
|
||||||
|
|
||||||
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmHqlNumericLiteral.class ) );
|
assertThat( relationalPredicate.getRightHandExpression(), instanceOf( SqmHqlNumericLiteral.class ) );
|
||||||
assertThat( ( (SqmHqlNumericLiteral<?>) relationalPredicate.getRightHandExpression() ).getLiteralValue(), is( "2" ) );
|
assertThat( ( (SqmHqlNumericLiteral<?>) relationalPredicate.getRightHandExpression() ).getUnparsedLiteralValue(), is( "2" ) );
|
||||||
|
|
||||||
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmPath.class ) );
|
assertThat( relationalPredicate.getLeftHandExpression(), instanceOf( SqmPath.class ) );
|
||||||
final SqmPath<?> indexPath = (SqmPath<?>) relationalPredicate.getLeftHandExpression();
|
final SqmPath<?> indexPath = (SqmPath<?>) relationalPredicate.getLeftHandExpression();
|
||||||
|
|
|
@ -61,7 +61,7 @@ public class SubqueryTest extends BaseSessionFactoryFunctionalTest {
|
||||||
public void render(
|
public void render(
|
||||||
SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
|
SqlAppender sqlAppender, List<? extends SqlAstNode> sqlAstArguments, SqlAstTranslator<?> walker) {
|
||||||
sqlAstArguments.get( 0 ).accept( walker );
|
sqlAstArguments.get( 0 ).accept( walker );
|
||||||
sqlAppender.appendSql( " limit " + ( (UnparsedNumericLiteral<?>) sqlAstArguments.get( 1 ) ).getLiteralValue() );
|
sqlAppender.appendSql( " limit " + ( (UnparsedNumericLiteral<?>) sqlAstArguments.get( 1 ) ).getUnparsedLiteralValue() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue