From 88bdfbfbd4c0cec58b17b8b09eb8a164151c8a7c Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Thu, 2 May 2024 12:47:04 +0200 Subject: [PATCH] HHH-18046 Cast parameters used as arithmetic operands on DB2 --- .../dialect/DB2LegacySqlAstTranslator.java | 5 ++ .../dialect/DerbyLegacySqlAstTranslator.java | 19 +------- .../dialect/H2LegacySqlAstTranslator.java | 9 +++- .../dialect/HSQLLegacySqlAstTranslator.java | 19 +------- .../PostgreSQLLegacySqlAstTranslator.java | 4 +- .../SQLServerLegacySqlAstTranslator.java | 4 +- .../SybaseASELegacySqlAstTranslator.java | 4 +- .../SybaseAnywhereSqlAstTranslator.java | 4 +- .../dialect/SybaseLegacySqlAstTranslator.java | 4 +- .../dialect/DB2SqlAstTranslator.java | 5 ++ .../dialect/DerbySqlAstTranslator.java | 19 +------- .../hibernate/dialect/H2SqlAstTranslator.java | 9 +++- .../dialect/HANASqlAstTranslator.java | 4 +- .../dialect/HSQLSqlAstTranslator.java | 19 +------- .../dialect/MariaDBSqlAstTranslator.java | 4 +- .../dialect/MySQLSqlAstTranslator.java | 4 +- .../dialect/PostgreSQLSqlAstTranslator.java | 4 +- .../dialect/SQLServerSqlAstTranslator.java | 4 +- .../dialect/SybaseASESqlAstTranslator.java | 4 +- .../dialect/SybaseSqlAstTranslator.java | 4 +- .../dialect/TiDBSqlAstTranslator.java | 4 +- .../sql/ast/spi/AbstractSqlAstTranslator.java | 12 +++-- .../hibernate/orm/test/hql/InferenceTest.java | 46 ++++++++++++++----- 23 files changed, 100 insertions(+), 114 deletions(-) diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacySqlAstTranslator.java index 9c7dba7a46ce..c56a215b5725 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacySqlAstTranslator.java @@ -139,6 +139,11 @@ protected void renderExpressionAsClauseItem(Expression expression) { } } + @Override + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + } + @Override public void visitBooleanExpressionPredicate(BooleanExpressionPredicate booleanExpressionPredicate) { if ( getDB2Version().isSameOrAfter( 11 ) ) { diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacySqlAstTranslator.java index bb654ab6ec76..3aea1a5ebc1d 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DerbyLegacySqlAstTranslator.java @@ -337,23 +337,8 @@ protected boolean supportsJoinInMutationStatementSubquery() { } @Override - public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { - final BinaryArithmeticOperator operator = arithmeticExpression.getOperator(); - if ( operator == BinaryArithmeticOperator.MODULO ) { - append( "mod" ); - appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); - appendSql( ',' ); - arithmeticExpression.getRightHandOperand().accept( this ); - appendSql( CLOSE_PARENTHESIS ); - } - else { - appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( CLOSE_PARENTHESIS ); - } + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); } } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacySqlAstTranslator.java index f43168433f3d..4739a94288d3 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/H2LegacySqlAstTranslator.java @@ -324,12 +324,17 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } + @Override + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + } + @Override protected boolean renderPrimaryTableReference(TableGroup tableGroup, LockMode lockMode) { final TableReference tableRef = tableGroup.getPrimaryTableReference(); diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacySqlAstTranslator.java index 79c5fc1e6965..8f7e958ee22b 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/HSQLLegacySqlAstTranslator.java @@ -352,22 +352,7 @@ private boolean supportsOffsetFetchClause() { } @Override - public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { - final BinaryArithmeticOperator operator = arithmeticExpression.getOperator(); - if ( operator == BinaryArithmeticOperator.MODULO ) { - append( "mod" ); - appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); - appendSql( ',' ); - arithmeticExpression.getRightHandOperand().accept( this ); - appendSql( CLOSE_PARENTHESIS ); - } - else { - appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( CLOSE_PARENTHESIS ); - } + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); } } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacySqlAstTranslator.java index cd6291a22824..4dae9260dac3 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacySqlAstTranslator.java @@ -330,9 +330,9 @@ public void visitLikePredicate(LikePredicate likePredicate) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLServerLegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLServerLegacySqlAstTranslator.java index 318be8b403d3..20495884f9ee 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLServerLegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLServerLegacySqlAstTranslator.java @@ -523,9 +523,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseASELegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseASELegacySqlAstTranslator.java index 811b399adee0..be42647e43c0 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseASELegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseASELegacySqlAstTranslator.java @@ -460,9 +460,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseAnywhereSqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseAnywhereSqlAstTranslator.java index 9dfb1b221c76..841594f12e66 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseAnywhereSqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseAnywhereSqlAstTranslator.java @@ -219,9 +219,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacySqlAstTranslator.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacySqlAstTranslator.java index 8e4352f39fe8..602992915c38 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacySqlAstTranslator.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SybaseLegacySqlAstTranslator.java @@ -242,9 +242,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DB2SqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/DB2SqlAstTranslator.java index ccf72844a66a..f9f73464cea4 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DB2SqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DB2SqlAstTranslator.java @@ -138,6 +138,11 @@ protected void renderExpressionAsClauseItem(Expression expression) { } } + @Override + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + } + @Override public void visitBooleanExpressionPredicate(BooleanExpressionPredicate booleanExpressionPredicate) { if ( getDB2Version().isSameOrAfter( 11 ) ) { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/DerbySqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/DerbySqlAstTranslator.java index cca3841c41d2..2788fca3a688 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/DerbySqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/DerbySqlAstTranslator.java @@ -337,22 +337,7 @@ protected boolean supportsJoinInMutationStatementSubquery() { } @Override - public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { - final BinaryArithmeticOperator operator = arithmeticExpression.getOperator(); - if ( operator == BinaryArithmeticOperator.MODULO ) { - append( "mod" ); - appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); - appendSql( ',' ); - arithmeticExpression.getRightHandOperand().accept( this ); - appendSql( CLOSE_PARENTHESIS ); - } - else { - appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( CLOSE_PARENTHESIS ); - } + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/H2SqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/H2SqlAstTranslator.java index 4bb4a5fd6ee5..62b049c6c2b7 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/H2SqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/H2SqlAstTranslator.java @@ -298,12 +298,17 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } + @Override + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); + } + @Override protected boolean renderPrimaryTableReference(TableGroup tableGroup, LockMode lockMode) { final TableReference tableRef = tableGroup.getPrimaryTableReference(); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/HANASqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/HANASqlAstTranslator.java index e8d063f32e8d..f4fbe42ee4bf 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/HANASqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/HANASqlAstTranslator.java @@ -53,9 +53,9 @@ public HANASqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { if ( isIntegerDivisionEmulationRequired( arithmeticExpression ) ) { appendSql( "cast(" ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( " as int)" ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/HSQLSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/HSQLSqlAstTranslator.java index 691ffd7bdf8d..f458720b9b7a 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/HSQLSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/HSQLSqlAstTranslator.java @@ -342,23 +342,8 @@ private boolean supportsOffsetFetchClause() { } @Override - public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { - final BinaryArithmeticOperator operator = arithmeticExpression.getOperator(); - if ( operator == BinaryArithmeticOperator.MODULO ) { - append( "mod" ); - appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); - appendSql( ',' ); - arithmeticExpression.getRightHandOperand().accept( this ); - appendSql( CLOSE_PARENTHESIS ); - } - else { - appendSql( OPEN_PARENTHESIS ); - render( arithmeticExpression.getLeftHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - render( arithmeticExpression.getRightHandOperand(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); - appendSql( CLOSE_PARENTHESIS ); - } + protected void visitArithmeticOperand(Expression expression) { + render( expression, SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBSqlAstTranslator.java index 302b624fb8c2..78272afe716e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/MariaDBSqlAstTranslator.java @@ -56,9 +56,9 @@ public MariaDBSqlAstTranslator(SessionFactoryImplementor sessionFactory, Stateme public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { if ( isIntegerDivisionEmulationRequired( arithmeticExpression ) ) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( " div " ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/MySQLSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/MySQLSqlAstTranslator.java index bdd27029c5a1..6be62a55c40e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/MySQLSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/MySQLSqlAstTranslator.java @@ -106,9 +106,9 @@ private static String getSqlType(CastTarget castTarget, String sqlType, Dialect public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { if ( isIntegerDivisionEmulationRequired( arithmeticExpression ) ) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( " div " ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLSqlAstTranslator.java index 11c804945e61..57552d2704d5 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQLSqlAstTranslator.java @@ -328,9 +328,9 @@ public void visitLikePredicate(LikePredicate likePredicate) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerSqlAstTranslator.java index d9c66a3c4fe9..e1973f09a7a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServerSqlAstTranslator.java @@ -492,9 +492,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASESqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASESqlAstTranslator.java index 9647b96113dc..fa67be563004 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASESqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseASESqlAstTranslator.java @@ -443,9 +443,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqlAstTranslator.java index 6c2703e11131..e4774530af98 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqlAstTranslator.java @@ -241,9 +241,9 @@ else if ( expression instanceof Summarization ) { @Override public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/TiDBSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/TiDBSqlAstTranslator.java index 7e2ed150b6d9..1a4320239020 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/TiDBSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/TiDBSqlAstTranslator.java @@ -59,9 +59,9 @@ public TiDBSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeticExpression) { if ( isIntegerDivisionEmulationRequired( arithmeticExpression ) ) { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( " div " ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index 48c318966e41..7d7985304d84 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -7190,20 +7190,24 @@ public void visitBinaryArithmeticExpression(BinaryArithmeticExpression arithmeti if ( operator == BinaryArithmeticOperator.MODULO ) { append( "mod" ); appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( ',' ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } else { appendSql( OPEN_PARENTHESIS ); - arithmeticExpression.getLeftHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getLeftHandOperand() ); appendSql( arithmeticExpression.getOperator().getOperatorSqlTextString() ); - arithmeticExpression.getRightHandOperand().accept( this ); + visitArithmeticOperand( arithmeticExpression.getRightHandOperand() ); appendSql( CLOSE_PARENTHESIS ); } } + protected void visitArithmeticOperand(Expression expression) { + expression.accept( this ); + } + @Override public void visitDuration(Duration duration) { duration.getMagnitude().accept( this ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/InferenceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/InferenceTest.java index a93d49cf9ccb..3cb4c790c124 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/hql/InferenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/hql/InferenceTest.java @@ -8,12 +8,13 @@ import java.util.List; -import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; +import org.hibernate.query.criteria.JpaCriteriaQuery; +import org.hibernate.query.criteria.JpaRoot; -import org.hibernate.testing.SkipForDialect; -import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.hibernate.testing.orm.junit.JiraKey; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -24,6 +25,7 @@ import jakarta.persistence.TypedQuery; import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; import static org.junit.Assert.assertThat; @@ -41,15 +43,22 @@ protected Class[] getAnnotatedClasses() { }; } - @Before - public void setUp() { - doInHibernate( this::sessionFactory, session -> { - person = new Person(); - person.setName("Johannes"); - person.setSurname("Buehler"); - session.persist(person); - } ); - } + @Before + public void setUp() { + doInHibernate( this::sessionFactory, session -> { + person = new Person(); + person.setName( "Johannes" ); + person.setSurname( "Buehler" ); + session.persist( person ); + } ); + } + + @After + public void cleanUp() { + doInHibernate( this::sessionFactory, session -> { + session.createMutationQuery( "delete from Person" ).executeUpdate(); + } ); + } @Test public void testBinaryArithmeticInference() { @@ -72,6 +81,19 @@ public void testInferenceSourceResetForOnClause() { } + @Test + @JiraKey("HHH-18046") + public void testBinaryArithmeticParameterInference() { + doInHibernate( this::sessionFactory, session -> { + HibernateCriteriaBuilder cb = session.getCriteriaBuilder(); + JpaCriteriaQuery cq = cb.createQuery( Double.class ); + JpaRoot root = cq.from( Person.class ); + cq.select( cb.toDouble( cb.prod( root.get( "id" ), 0.5f ) ) ); + Double result = session.createQuery( cq ).getSingleResult(); + assertThat( result, is( person.getId() * 0.5d ) ); + } ); + } + @Entity(name = "Person") public static class Person {