Skip to content

Commit a8313f5

Browse files
committed
re-enable tests
re-organize some tests continuing with o.h.test.hql improve cast-target handling #3889
1 parent 4f2b077 commit a8313f5

28 files changed

+226
-83
lines changed

hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,15 @@ castFunction
769769
;
770770

771771
castTarget
772-
: identifier (LEFT_PAREN INTEGER_LITERAL (COMMA INTEGER_LITERAL)? RIGHT_PAREN)?
772+
: castTargetType (LEFT_PAREN INTEGER_LITERAL (COMMA INTEGER_LITERAL)? RIGHT_PAREN)?
773+
;
774+
775+
/**
776+
* Like the `entityName` rule, we have a specialized dotIdentifierSequence rule
777+
*/
778+
castTargetType
779+
returns [String fullTargetName]
780+
: (i=identifier { $fullTargetName = _localctx.i.getText(); }) (DOT c=identifier { $fullTargetName += ("." + _localctx.c.getText() ); })*
773781
;
774782

775783
concatFunction

hibernate-core/src/main/java/org/hibernate/dialect/FirebirdSqlAstTranslator.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,28 @@
1111

1212
import org.hibernate.engine.spi.SessionFactoryImplementor;
1313
import org.hibernate.internal.util.collections.Stack;
14-
import org.hibernate.metamodel.mapping.BasicValuedMapping;
1514
import org.hibernate.metamodel.mapping.JdbcMapping;
1615
import org.hibernate.query.ComparisonOperator;
1716
import org.hibernate.query.sqm.sql.internal.SqmParameterInterpretation;
1817
import org.hibernate.sql.ast.Clause;
1918
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
2019
import org.hibernate.sql.ast.spi.SqlAppender;
21-
import org.hibernate.sql.ast.tree.SqlAstNode;
2220
import org.hibernate.sql.ast.spi.SqlSelection;
21+
import org.hibernate.sql.ast.tree.SqlAstNode;
2322
import org.hibernate.sql.ast.tree.Statement;
2423
import org.hibernate.sql.ast.tree.cte.CteStatement;
2524
import org.hibernate.sql.ast.tree.expression.CastTarget;
25+
import org.hibernate.sql.ast.tree.expression.Expression;
2626
import org.hibernate.sql.ast.tree.expression.FunctionExpression;
2727
import org.hibernate.sql.ast.tree.expression.JdbcLiteral;
2828
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
2929
import org.hibernate.sql.ast.tree.expression.Literal;
30+
import org.hibernate.sql.ast.tree.expression.NullnessLiteral;
3031
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
3132
import org.hibernate.sql.ast.tree.expression.SelfRenderingExpression;
32-
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
33-
import org.hibernate.sql.ast.tree.expression.Expression;
34-
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
35-
import org.hibernate.sql.ast.tree.expression.Literal;
36-
import org.hibernate.sql.ast.tree.expression.NullnessLiteral;
3733
import org.hibernate.sql.ast.tree.expression.SqlTuple;
3834
import org.hibernate.sql.ast.tree.expression.Summarization;
35+
import org.hibernate.sql.ast.tree.predicate.SelfRenderingPredicate;
3936
import org.hibernate.sql.ast.tree.select.QueryGroup;
4037
import org.hibernate.sql.ast.tree.select.QueryPart;
4138
import org.hibernate.sql.ast.tree.select.QuerySpec;
@@ -247,7 +244,7 @@ public void visitParameter(JdbcParameter jdbcParameter) {
247244
final JdbcMapping jdbcMapping = jdbcParameter.getExpressionType().getJdbcMappings().get( 0 );
248245
final List<SqlAstNode> arguments = new ArrayList<>( 2 );
249246
arguments.add( jdbcParameter );
250-
arguments.add( new CastTarget( (BasicValuedMapping) jdbcMapping ) );
247+
arguments.add( new CastTarget( jdbcMapping ) );
251248
castFunction().render( this, arguments, this );
252249
}
253250
finally {

hibernate-core/src/main/java/org/hibernate/dialect/function/CastFunction.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.hibernate.dialect.Dialect;
1313
import org.hibernate.metamodel.mapping.JdbcMapping;
14-
import org.hibernate.metamodel.mapping.SqlExpressable;
1514
import org.hibernate.query.CastType;
1615
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1716
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
@@ -54,11 +53,11 @@ private CastType getBooleanCastType(int preferredSqlTypeCodeForBoolean) {
5453
@Override
5554
public void render(SqlAppender sqlAppender, List<SqlAstNode> arguments, SqlAstTranslator<?> walker) {
5655
final Expression source = (Expression) arguments.get( 0 );
57-
final JdbcMapping sourceMapping = ( (SqlExpressable) source.getExpressionType() ).getJdbcMapping();
56+
final JdbcMapping sourceMapping = source.getExpressionType().getJdbcMappings().get( 0 );
5857
final CastType sourceType = getCastType( sourceMapping );
5958

6059
final CastTarget castTarget = (CastTarget) arguments.get( 1 );
61-
final JdbcMapping targetJdbcMapping = castTarget.getExpressionType().getJdbcMapping();
60+
final JdbcMapping targetJdbcMapping = castTarget.getExpressionType().getJdbcMappings().get( 0 );
6261
final CastType targetType = getCastType( targetJdbcMapping );
6362

6463
String cast = dialect.castPattern( sourceType, targetType );

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/Bindable.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.Incubating;
1313
import org.hibernate.NotYetImplementedFor6Exception;
1414
import org.hibernate.engine.spi.SharedSessionContractImplementor;
15+
import org.hibernate.internal.util.MutableInteger;
1516
import org.hibernate.mapping.IndexedConsumer;
1617
import org.hibernate.sql.ast.Clause;
1718

@@ -24,7 +25,7 @@
2425
* @author Steve Ebersole
2526
*/
2627
@Incubating
27-
public interface Bindable {
28+
public interface Bindable extends JdbcMappingContainer {
2829
/*
2930
* todo (6.0) : much of this contract uses Clause which (1) kludgy and (2) not always necessary
3031
* - e.g. see the note below wrt "2 forms of JDBC-type visiting"

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/JdbcMapping.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
*/
77
package org.hibernate.metamodel.mapping;
88

9+
import java.util.Collections;
10+
import java.util.List;
11+
12+
import org.hibernate.mapping.IndexedConsumer;
913
import org.hibernate.query.CastType;
1014
import org.hibernate.type.descriptor.ValueBinder;
1115
import org.hibernate.type.descriptor.ValueExtractor;
@@ -17,7 +21,7 @@
1721
*
1822
* @author Steve Ebersole
1923
*/
20-
public interface JdbcMapping extends MappingType {
24+
public interface JdbcMapping extends MappingType, JdbcMappingContainer {
2125
/**
2226
* The descriptor for the Java type represented by this
2327
* expressable type
@@ -50,4 +54,26 @@ default CastType getCastType() {
5054
default JavaTypeDescriptor getMappedJavaTypeDescriptor() {
5155
return getJavaTypeDescriptor();
5256
}
57+
58+
@Override
59+
default int getJdbcTypeCount() {
60+
return 1;
61+
}
62+
63+
@Override
64+
default List<JdbcMapping> getJdbcMappings() {
65+
return Collections.singletonList( this );
66+
}
67+
68+
@Override
69+
default int forEachJdbcType(IndexedConsumer<JdbcMapping> action) {
70+
action.accept( 0, this );
71+
return 1;
72+
}
73+
74+
@Override
75+
default int forEachJdbcType(int offset, IndexedConsumer<JdbcMapping> action) {
76+
action.accept( 0, this );
77+
return 1;
78+
}
5379
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.metamodel.mapping;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
import org.hibernate.NotYetImplementedFor6Exception;
13+
import org.hibernate.mapping.IndexedConsumer;
14+
15+
/**
16+
* Container for one-or-more JdbcMappings
17+
*/
18+
public interface JdbcMappingContainer {
19+
/**
20+
* The number of JDBC mappings
21+
*/
22+
default int getJdbcTypeCount() {
23+
return forEachJdbcType( (index, jdbcMapping) -> {} );
24+
}
25+
26+
/**
27+
* The list of JDBC mappings
28+
*/
29+
default List<JdbcMapping> getJdbcMappings() {
30+
final List<JdbcMapping> results = new ArrayList<>();
31+
forEachJdbcType( (index, jdbcMapping) -> results.add( jdbcMapping ) );
32+
return results;
33+
}
34+
35+
/**
36+
* Visit each of JdbcMapping
37+
*
38+
* @apiNote Same as {@link #forEachJdbcType(int, IndexedConsumer)} starting from `0`
39+
*/
40+
default int forEachJdbcType(IndexedConsumer<JdbcMapping> action) {
41+
return forEachJdbcType( 0, action );
42+
}
43+
44+
/**
45+
* Visit each JdbcMapping starting from the given offset
46+
*/
47+
default int forEachJdbcType(int offset, IndexedConsumer<JdbcMapping> action) {
48+
throw new NotYetImplementedFor6Exception( getClass() );
49+
}
50+
}

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/SqlExpressable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*
1515
* @author Steve Ebersole
1616
*/
17-
public interface SqlExpressable {
17+
public interface SqlExpressable extends JdbcMappingContainer {
1818
/**
1919
* Any thing that is expressable at the SQL AST level
2020
* would be of basic type.

hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3388,7 +3388,7 @@ public SqmExpression<?> visitCastFunction(HqlParser.CastFunctionContext ctx) {
33883388

33893389
@Override
33903390
public SqmCastTarget<?> visitCastTarget(HqlParser.CastTargetContext castTargetContext) {
3391-
String targetName = castTargetContext.identifier().getText();
3391+
final String targetName = castTargetContext.castTargetType().fullTargetName;
33923392

33933393
List<TerminalNode> args = castTargetContext.INTEGER_LITERAL();
33943394
Long length = args.size() == 1 ? Long.valueOf( args.get(0).getText() ) : null;

hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingFunctionSqlAstExpression.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
*/
77
package org.hibernate.query.sqm.function;
88

9+
import java.util.List;
10+
911
import org.hibernate.dialect.Dialect;
1012
import org.hibernate.engine.spi.SessionFactoryImplementor;
1113
import org.hibernate.mapping.Selectable;
1214
import org.hibernate.mapping.Table;
1315
import org.hibernate.metamodel.mapping.JdbcMapping;
14-
import org.hibernate.metamodel.mapping.MappingModelExpressable;
16+
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
1517
import org.hibernate.metamodel.mapping.SqlExpressable;
1618
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
1719
import org.hibernate.query.SemanticException;
@@ -32,8 +34,6 @@
3234
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
3335
import org.hibernate.type.spi.TypeConfiguration;
3436

35-
import java.util.List;
36-
3737
/**
3838
* Representation of a function call in the SQL AST for impls that know how to
3939
* render themselves.
@@ -46,14 +46,14 @@ public class SelfRenderingFunctionSqlAstExpression
4646
private final FunctionRenderingSupport renderer;
4747
private final List<SqlAstNode> sqlAstArguments;
4848
private final AllowableFunctionReturnType<?> type;
49-
private final MappingModelExpressable<?> expressable;
49+
private final JdbcMappingContainer expressable;
5050

5151
public SelfRenderingFunctionSqlAstExpression(
5252
String functionName,
5353
FunctionRenderingSupport renderer,
5454
List<SqlAstNode> sqlAstArguments,
5555
AllowableFunctionReturnType<?> type,
56-
MappingModelExpressable<?> expressable) {
56+
JdbcMappingContainer expressable) {
5757
this.functionName = functionName;
5858
this.renderer = renderer;
5959
this.sqlAstArguments = sqlAstArguments;
@@ -73,7 +73,7 @@ public List<SqlAstNode> getArguments() {
7373
}
7474

7575
@Override
76-
public MappingModelExpressable getExpressionType() {
76+
public JdbcMappingContainer getExpressionType() {
7777
return expressable;
7878
}
7979

hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardFunctionReturnTypeResolvers.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66
*/
77
package org.hibernate.query.sqm.produce.function;
88

9+
import java.sql.Types;
10+
import java.util.List;
11+
import java.util.Locale;
12+
import java.util.function.Supplier;
13+
914
import org.hibernate.QueryException;
1015
import org.hibernate.metamodel.mapping.BasicValuedMapping;
11-
import org.hibernate.metamodel.mapping.MappingModelExpressable;
16+
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
1217
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
1318
import org.hibernate.query.sqm.SqmExpressable;
1419
import org.hibernate.query.sqm.tree.SqmTypedNode;
@@ -17,11 +22,6 @@
1722
import org.hibernate.type.BasicType;
1823
import org.hibernate.type.spi.TypeConfiguration;
1924

20-
import java.sql.Types;
21-
import java.util.List;
22-
import java.util.Locale;
23-
import java.util.function.Supplier;
24-
2525
/**
2626
* @author Steve Ebersole
2727
*/
@@ -90,7 +90,7 @@ public BasicValuedMapping resolveFunctionReturnType(Supplier<BasicValuedMapping>
9090
continue;
9191
}
9292

93-
final MappingModelExpressable<?> nodeType = ( (Expression) arg ).getExpressionType();
93+
final JdbcMappingContainer nodeType = ( (Expression) arg ).getExpressionType();
9494
if ( nodeType instanceof BasicValuedMapping ) {
9595
final BasicValuedMapping argType = (BasicValuedMapping) nodeType;
9696
return useImpliedTypeIfPossible( argType, impliedTypeAccess.get() );
@@ -220,7 +220,7 @@ public static AllowableFunctionReturnType<?> extractArgumentType(List<SqmTypedNo
220220

221221
public static BasicValuedMapping extractArgumentValuedMapping(List<? extends SqlAstNode> arguments, int position) {
222222
final SqlAstNode specifiedArgument = arguments.get( position-1 );
223-
final MappingModelExpressable<?> specifiedArgType = specifiedArgument instanceof Expression
223+
final JdbcMappingContainer specifiedArgType = specifiedArgument instanceof Expression
224224
? ( (Expression) specifiedArgument ).getExpressionType()
225225
: null;
226226

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.hibernate.metamodel.mapping.EntityMappingType;
5555
import org.hibernate.metamodel.mapping.EntityVersionMapping;
5656
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
57+
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
5758
import org.hibernate.metamodel.mapping.MappingModelExpressable;
5859
import org.hibernate.metamodel.mapping.ModelPart;
5960
import org.hibernate.metamodel.mapping.ModelPartContainer;
@@ -2226,7 +2227,7 @@ else if ( appliedByUnit != null ) {
22262227
// we must convert this duration from
22272228
// nanoseconds to the given unit
22282229

2229-
MappingModelExpressable durationType = scaledExpression.getExpressionType();
2230+
JdbcMappingContainer durationType = scaledExpression.getExpressionType();
22302231
Duration duration = new Duration( scaledExpression, NANOSECOND, (BasicValuedMapping) durationType );
22312232

22322233
TemporalUnit appliedUnit = appliedByUnit.getUnit().getUnit();
@@ -2344,12 +2345,12 @@ public Expression visitLiteral(SqmLiteral<?> literal) {
23442345
);
23452346
}
23462347

2347-
private MappingModelExpressable<?> getKeyExpressable(MappingModelExpressable<?> mappingModelExpressable) {
2348+
private MappingModelExpressable<?> getKeyExpressable(JdbcMappingContainer mappingModelExpressable) {
23482349
if ( mappingModelExpressable instanceof EntityAssociationMapping ) {
23492350
return ( (EntityAssociationMapping) mappingModelExpressable ).getKeyTargetMatchPart();
23502351
}
23512352
else {
2352-
return mappingModelExpressable;
2353+
return (MappingModelExpressable<?>) mappingModelExpressable;
23532354
}
23542355
}
23552356

@@ -2734,7 +2735,7 @@ public Object visitCastTarget(SqmCastTarget target) {
27342735
targetType = InferredBasicValueResolver.resolveSqlTypeIndicators( this, (BasicType<?>) targetType );
27352736
}
27362737
return new CastTarget(
2737-
targetType,
2738+
targetType.getJdbcMapping(),
27382739
target.getLength(),
27392740
target.getPrecision(),
27402741
target.getScale()
@@ -3249,7 +3250,7 @@ private Object transformDurationArithmetic(SqmBinaryArithmetic<?> expression) {
32493250
Expression timestamp = adjustedTimestamp;
32503251
SqmExpressable<?> timestampType = adjustedTimestampType;
32513252
adjustedTimestamp = toSqlExpression( expression.getLeftHandOperand().accept( this ) );
3252-
MappingModelExpressable type = adjustedTimestamp.getExpressionType();
3253+
JdbcMappingContainer type = adjustedTimestamp.getExpressionType();
32533254
if ( type instanceof SqmExpressable ) {
32543255
adjustedTimestampType = (SqmExpressable) type;
32553256
}

0 commit comments

Comments
 (0)