Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 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_DISTINCT_FROM:
case NOT_EQUAL:
case DISTINCT_FROM:
appendSql( "cast(" );
lhs.accept( this );
appendSql( " as nvarchar(max))" );
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 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_DISTINCT_FROM:
case NOT_EQUAL:
case DISTINCT_FROM:
appendSql( "cast(" );
lhs.accept( this );
appendSql( " as nvarchar(max))" );
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected void renderJsonTable(
selectableMapping
) );
}
sqlAppender.append( ' ' );
sqlAppender.append( " as " );
sqlAppender.append( selectableMapping.getSelectionExpression() );
} );
sqlAppender.appendSql( " from jsonb_array_elements(" );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,18 @@ public DB2XmlTableFunction(TypeConfiguration typeConfiguration) {
protected void renderXmlTable(SqlAppender sqlAppender, XmlTableArguments arguments, AnonymousTupleTableGroupProducer tupleType, String tableIdentifierVariable, SqlAstTranslator<?> walker) {
sqlAppender.appendSql( "xmltable(" );
// DB2 doesn't like parameters for the xpath expression
walker.render( arguments.xpath(), SqlAstNodeRenderingMode.INLINE_PARAMETERS );
final String xpath = walker.getLiteralValue( arguments.xpath() );
sqlAppender.appendSingleQuoteEscapedString( "$d" + xpath );
sqlAppender.appendSql( " passing " );
if ( !arguments.isXmlType() ) {
sqlAppender.appendSql( "xmlparse(document " );
}
// DB2 needs parameters to be casted here
walker.render( arguments.xmlDocument(), SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER );
if ( !arguments.isXmlType() ) {
sqlAppender.appendSql( ")" );
sqlAppender.appendSql( ')' );
}
sqlAppender.appendSql( " as \"d\"" );
renderColumns( sqlAppender, arguments.columnsClause(), walker );
sqlAppender.appendSql( ')' );
}
Expand All @@ -69,7 +71,10 @@ protected void renderXmlValueColumnDefinition(SqlAppender sqlAppender, XmlTableV
}

static boolean isBoolean(JdbcMapping type) {
return type.getJdbcType().isBoolean();
return switch ( type.getCastType() ) {
case BOOLEAN, TF_BOOLEAN, YN_BOOLEAN, INTEGER_BOOLEAN -> true;
default -> false;
};
}

private static class DB2XmlTableSetReturningFunctionTypeResolver extends XmlTableSetReturningFunctionTypeResolver {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,10 @@ protected void renderDefaultExpression(@Nullable Expression expression, SqlAppen
}

static boolean isBoolean(JdbcMapping type) {
return type.getJdbcType().isBoolean();
return switch ( type.getCastType() ) {
case BOOLEAN, TF_BOOLEAN, YN_BOOLEAN, INTEGER_BOOLEAN -> true;
default -> false;
};
}

private static class DB2XmlTableSetReturningFunctionTypeResolver extends XmlTableSetReturningFunctionTypeResolver {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,9 @@ protected void addSelectableMapping(List<SelectableMapping> selectableMappings,
}

public static boolean isBoolean(JdbcMapping type) {
return type.getJavaTypeDescriptor().getJavaTypeClass() == Boolean.class;
return switch ( type.getCastType() ) {
case BOOLEAN, TF_BOOLEAN, YN_BOOLEAN, INTEGER_BOOLEAN -> true;
default -> false;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import org.hibernate.annotations.Nationalized;
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;

import org.hibernate.testing.orm.junit.DialectFeatureChecks;
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
import org.junit.Test;

import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
Expand All @@ -18,6 +20,7 @@
/**
* @author Vlad Mihalcea
*/
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsUnicodeNClob.class)
public class NationalizedTest extends BaseEntityManagerFunctionalTestCase {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.SpannerDialect;
import org.hibernate.dialect.SybaseASEDialect;
import org.hibernate.dialect.SybaseDialect;
import org.hibernate.dialect.SybaseDriverKind;
import org.hibernate.dialect.TiDBDialect;
Expand Down Expand Up @@ -1023,6 +1024,15 @@ public boolean apply(Dialect dialect) {
}
}

public static class SupportsUnicodeNClob implements DialectFeatureCheck {
@Override
public boolean apply(Dialect dialect) {
return !(dialect instanceof SybaseASEDialect aseDialect)
// The jconn driver apparently doesn't support unicode characters
|| aseDialect.getDriverKind() == SybaseDriverKind.JTDS;
}
}

private static final HashMap<Dialect, SqmFunctionRegistry> FUNCTION_REGISTRIES = new HashMap<>();

public static boolean definesFunction(Dialect dialect, String functionName) {
Expand Down
Loading