From 3d483887c1da0c6c386e9eaace3d884ff54e02d5 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 8 Jul 2024 17:20:33 +0200 Subject: [PATCH] HHH-18352 Don't emulate tuple comparison with subquery if possible --- .../org/hibernate/dialect/OracleSqlAstTranslator.java | 10 ---------- .../sql/ast/spi/AbstractSqlAstTranslator.java | 6 +++--- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleSqlAstTranslator.java index daddaacc43..09bc7b3ba2 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleSqlAstTranslator.java @@ -539,21 +539,11 @@ protected boolean supportsRowValueConstructorSyntax() { return false; } - @Override - protected boolean supportsRowValueConstructorSyntaxInInList() { - return true; - } - @Override protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() { return false; } - @Override - protected boolean supportsRowValueConstructorSyntaxInInSubQuery() { - return true; - } - @Override protected String getFromDual() { return " from dual"; 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 39d3fc483c..368add22cd 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 @@ -7714,14 +7714,14 @@ else if ( subquery != null && !supportsRowValueConstructorSyntaxInQuantifiedPred else if ( needsTupleComparisonEmulation( operator ) ) { rhsTuple = SqlTupleContainer.getSqlTuple( rhsExpression ); assert rhsTuple != null; - // Some DBs like Oracle support tuples only for the IN subquery predicate - if ( ( operator == ComparisonOperator.EQUAL || operator == ComparisonOperator.NOT_EQUAL ) && supportsRowValueConstructorSyntaxInInSubQuery() ) { + // If the DB supports tuples in the IN list predicate, use that syntax as it's more concise + if ( ( operator == ComparisonOperator.EQUAL || operator == ComparisonOperator.NOT_EQUAL ) && supportsRowValueConstructorSyntaxInInList() ) { comparisonPredicate.getLeftHandExpression().accept( this ); if ( operator == ComparisonOperator.NOT_EQUAL ) { appendSql( " not" ); } appendSql( " in (" ); - renderExpressionsAsSubquery( rhsTuple.getExpressions() ); + rhsTuple.accept( this ); appendSql( CLOSE_PARENTHESIS ); } else {