HHH-18352 Don't emulate tuple comparison with subquery if possible

This commit is contained in:
Christian Beikov 2024-07-08 17:20:33 +02:00
parent aeab7ac229
commit ad4dccaf6a
2 changed files with 3 additions and 13 deletions

View File

@ -606,21 +606,11 @@ public class OracleSqlAstTranslator<T extends JdbcOperation> extends SqlAstTrans
return false;
}
@Override
protected boolean supportsRowValueConstructorSyntaxInInList() {
return true;
}
@Override
protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
return false;
}
@Override
protected boolean supportsRowValueConstructorSyntaxInInSubQuery() {
return true;
}
@Override
protected String getDual() {
return "dual";

View File

@ -8285,14 +8285,14 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
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 {