mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-07 11:48:18 +00:00
Don't render distinct from predicate on SQL Server versions that don't support it
This commit is contained in:
parent
c0804d366c
commit
f12c6c3aed
@ -492,10 +492,28 @@ protected void renderComparison(Expression lhs, ComparisonOperator operator, Exp
|
||||
&& lhsExpressionType.getSingleJdbcMapping().getJdbcType().getDdlTypeCode() == SqlTypes.SQLXML ) {
|
||||
// In SQL Server, XMLTYPE is not "comparable", so we have to cast the two parts to varchar for this purpose
|
||||
switch ( operator ) {
|
||||
case EQUAL:
|
||||
case NOT_DISTINCT_FROM:
|
||||
case NOT_EQUAL:
|
||||
case DISTINCT_FROM:
|
||||
if ( !supportsDistinctFromPredicate() ) {
|
||||
appendSql( "not " );
|
||||
}
|
||||
case NOT_DISTINCT_FROM: {
|
||||
if ( !supportsDistinctFromPredicate() ) {
|
||||
appendSql( "exists (select cast(" );
|
||||
getClauseStack().push( Clause.SELECT );
|
||||
visitSqlSelectExpression( lhs );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
appendSql( getFromDualForSelectOnly() );
|
||||
appendSql( " intersect select cast(" );
|
||||
visitSqlSelectExpression( rhs );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
appendSql( getFromDualForSelectOnly() );
|
||||
getClauseStack().pop();
|
||||
appendSql( CLOSE_PARENTHESIS );
|
||||
return;
|
||||
}
|
||||
}
|
||||
case EQUAL:
|
||||
case NOT_EQUAL:
|
||||
appendSql( "cast(" );
|
||||
lhs.accept( this );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
@ -509,7 +527,17 @@ protected void renderComparison(Expression lhs, ComparisonOperator operator, Exp
|
||||
break;
|
||||
}
|
||||
}
|
||||
renderComparisonEmulateIntersect( lhs, operator, rhs );
|
||||
if ( supportsDistinctFromPredicate() ) {
|
||||
renderComparisonStandard( lhs, operator, rhs );
|
||||
}
|
||||
else {
|
||||
renderComparisonEmulateIntersect( lhs, operator, rhs );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsDistinctFromPredicate() {
|
||||
return getDialect().getVersion().isSameOrAfter( 16 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -463,10 +463,28 @@ protected void renderComparison(Expression lhs, ComparisonOperator operator, Exp
|
||||
&& lhsExpressionType.getSingleJdbcMapping().getJdbcType().getDdlTypeCode() == SqlTypes.SQLXML ) {
|
||||
// In SQL Server, XMLTYPE is not "comparable", so we have to cast the two parts to varchar for this purpose
|
||||
switch ( operator ) {
|
||||
case EQUAL:
|
||||
case NOT_DISTINCT_FROM:
|
||||
case NOT_EQUAL:
|
||||
case DISTINCT_FROM:
|
||||
if ( !supportsDistinctFromPredicate() ) {
|
||||
appendSql( "not " );
|
||||
}
|
||||
case NOT_DISTINCT_FROM: {
|
||||
if ( !supportsDistinctFromPredicate() ) {
|
||||
appendSql( "exists (select cast(" );
|
||||
getClauseStack().push( Clause.SELECT );
|
||||
visitSqlSelectExpression( lhs );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
appendSql( getFromDualForSelectOnly() );
|
||||
appendSql( " intersect select cast(" );
|
||||
visitSqlSelectExpression( rhs );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
appendSql( getFromDualForSelectOnly() );
|
||||
getClauseStack().pop();
|
||||
appendSql( CLOSE_PARENTHESIS );
|
||||
return;
|
||||
}
|
||||
}
|
||||
case EQUAL:
|
||||
case NOT_EQUAL:
|
||||
appendSql( "cast(" );
|
||||
lhs.accept( this );
|
||||
appendSql( " as nvarchar(max))" );
|
||||
@ -480,7 +498,17 @@ protected void renderComparison(Expression lhs, ComparisonOperator operator, Exp
|
||||
break;
|
||||
}
|
||||
}
|
||||
renderComparisonEmulateIntersect( lhs, operator, rhs );
|
||||
if ( supportsDistinctFromPredicate() ) {
|
||||
renderComparisonStandard( lhs, operator, rhs );
|
||||
}
|
||||
else {
|
||||
renderComparisonEmulateIntersect( lhs, operator, rhs );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportsDistinctFromPredicate() {
|
||||
return getDialect().getVersion().isSameOrAfter( 16 );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user