HHH-15736 Add escape logic to cockroach and fix mysql 5.7
This commit is contained in:
parent
ae54ca8ae7
commit
fc7bdce2c8
|
@ -15,6 +15,7 @@ import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
import org.hibernate.sql.ast.tree.expression.Literal;
|
import org.hibernate.sql.ast.tree.expression.Literal;
|
||||||
import org.hibernate.sql.ast.tree.expression.Summarization;
|
import org.hibernate.sql.ast.tree.expression.Summarization;
|
||||||
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
|
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
|
||||||
|
import org.hibernate.sql.ast.tree.predicate.LikePredicate;
|
||||||
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
||||||
import org.hibernate.sql.ast.tree.select.QueryPart;
|
import org.hibernate.sql.ast.tree.select.QueryPart;
|
||||||
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
|
@ -153,6 +154,31 @@ public class CockroachLegacySqlAstTranslator<T extends JdbcOperation> extends Ab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitLikePredicate(LikePredicate likePredicate) {
|
||||||
|
// Custom implementation because CockroachDB uses backslash as default escape character
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
if ( likePredicate.isCaseSensitive() ) {
|
||||||
|
appendSql( " like " );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( WHITESPACE );
|
||||||
|
appendSql( getDialect().getCaseInsensitiveLike() );
|
||||||
|
appendSql( WHITESPACE );
|
||||||
|
}
|
||||||
|
likePredicate.getPattern().accept( this );
|
||||||
|
if ( likePredicate.getEscapeCharacter() != null ) {
|
||||||
|
appendSql( " escape " );
|
||||||
|
likePredicate.getEscapeCharacter().accept( this );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( " escape ''" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
|
protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -143,14 +143,52 @@ public class MySQLLegacySqlAstTranslator<T extends JdbcOperation> extends Abstra
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitLikePredicate(LikePredicate likePredicate) {
|
public void visitLikePredicate(LikePredicate likePredicate) {
|
||||||
super.visitLikePredicate( likePredicate );
|
|
||||||
// Custom implementation because MySQL uses backslash as the default escape character
|
// Custom implementation because MySQL uses backslash as the default escape character
|
||||||
// We can override this by specifying an empty escape character
|
if ( getDialect().getVersion().isSameOrAfter( 8 ) ) {
|
||||||
|
// From version 8 we can override this by specifying an empty escape character
|
||||||
// See https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
|
// See https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
|
||||||
if ( !( (MySQLLegacyDialect) getDialect() ).isNoBackslashEscapesEnabled() && likePredicate.getEscapeCharacter() == null ) {
|
super.visitLikePredicate( likePredicate );
|
||||||
|
if ( !getDialect().isNoBackslashEscapesEnabled() && likePredicate.getEscapeCharacter() == null ) {
|
||||||
appendSql( " escape ''" );
|
appendSql( " escape ''" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if ( likePredicate.isCaseSensitive() ) {
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
appendSql( " like " );
|
||||||
|
renderBackslashEscapedLikePattern(
|
||||||
|
likePredicate.getPattern(),
|
||||||
|
likePredicate.getEscapeCharacter(),
|
||||||
|
getDialect().isNoBackslashEscapesEnabled()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( getDialect().getLowercaseFunction() );
|
||||||
|
appendSql( OPEN_PARENTHESIS );
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
appendSql( CLOSE_PARENTHESIS );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
appendSql( " like " );
|
||||||
|
appendSql( getDialect().getLowercaseFunction() );
|
||||||
|
appendSql( OPEN_PARENTHESIS );
|
||||||
|
renderBackslashEscapedLikePattern(
|
||||||
|
likePredicate.getPattern(),
|
||||||
|
likePredicate.getEscapeCharacter(),
|
||||||
|
getDialect().isNoBackslashEscapesEnabled()
|
||||||
|
);
|
||||||
|
appendSql( CLOSE_PARENTHESIS );
|
||||||
|
}
|
||||||
|
if ( likePredicate.getEscapeCharacter() != null ) {
|
||||||
|
appendSql( " escape " );
|
||||||
|
likePredicate.getEscapeCharacter().accept( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsRowValueConstructorSyntaxInSet() {
|
public boolean supportsRowValueConstructorSyntaxInSet() {
|
||||||
|
@ -197,4 +235,9 @@ public class MySQLLegacySqlAstTranslator<T extends JdbcOperation> extends Abstra
|
||||||
protected String getFromDual() {
|
protected String getFromDual() {
|
||||||
return " from dual";
|
return " from dual";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MySQLDialect getDialect() {
|
||||||
|
return (MySQLDialect) super.getDialect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
import org.hibernate.sql.ast.tree.expression.Literal;
|
import org.hibernate.sql.ast.tree.expression.Literal;
|
||||||
import org.hibernate.sql.ast.tree.expression.Summarization;
|
import org.hibernate.sql.ast.tree.expression.Summarization;
|
||||||
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
|
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
|
||||||
|
import org.hibernate.sql.ast.tree.predicate.LikePredicate;
|
||||||
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
||||||
import org.hibernate.sql.ast.tree.select.QueryPart;
|
import org.hibernate.sql.ast.tree.select.QueryPart;
|
||||||
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
|
@ -125,6 +126,31 @@ public class CockroachSqlAstTranslator<T extends JdbcOperation> extends Abstract
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitLikePredicate(LikePredicate likePredicate) {
|
||||||
|
// Custom implementation because CockroachDB uses backslash as default escape character
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
if ( likePredicate.isCaseSensitive() ) {
|
||||||
|
appendSql( " like " );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( WHITESPACE );
|
||||||
|
appendSql( getDialect().getCaseInsensitiveLike() );
|
||||||
|
appendSql( WHITESPACE );
|
||||||
|
}
|
||||||
|
likePredicate.getPattern().accept( this );
|
||||||
|
if ( likePredicate.getEscapeCharacter() != null ) {
|
||||||
|
appendSql( " escape " );
|
||||||
|
likePredicate.getEscapeCharacter().accept( this );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( " escape ''" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
|
protected boolean supportsRowValueConstructorSyntaxInQuantifiedPredicates() {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -142,14 +142,52 @@ public class MySQLSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlA
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitLikePredicate(LikePredicate likePredicate) {
|
public void visitLikePredicate(LikePredicate likePredicate) {
|
||||||
super.visitLikePredicate( likePredicate );
|
|
||||||
// Custom implementation because MySQL uses backslash as the default escape character
|
// Custom implementation because MySQL uses backslash as the default escape character
|
||||||
// We can override this by specifying an empty escape character
|
if ( getDialect().getVersion().isSameOrAfter( 8 ) ) {
|
||||||
|
// From version 8 we can override this by specifying an empty escape character
|
||||||
// See https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
|
// See https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like
|
||||||
if ( !( (MySQLDialect) getDialect() ).isNoBackslashEscapesEnabled() && likePredicate.getEscapeCharacter() == null ) {
|
super.visitLikePredicate( likePredicate );
|
||||||
|
if ( !getDialect().isNoBackslashEscapesEnabled() && likePredicate.getEscapeCharacter() == null ) {
|
||||||
appendSql( " escape ''" );
|
appendSql( " escape ''" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if ( likePredicate.isCaseSensitive() ) {
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
appendSql( " like " );
|
||||||
|
renderBackslashEscapedLikePattern(
|
||||||
|
likePredicate.getPattern(),
|
||||||
|
likePredicate.getEscapeCharacter(),
|
||||||
|
getDialect().isNoBackslashEscapesEnabled()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendSql( getDialect().getLowercaseFunction() );
|
||||||
|
appendSql( OPEN_PARENTHESIS );
|
||||||
|
likePredicate.getMatchExpression().accept( this );
|
||||||
|
appendSql( CLOSE_PARENTHESIS );
|
||||||
|
if ( likePredicate.isNegated() ) {
|
||||||
|
appendSql( " not" );
|
||||||
|
}
|
||||||
|
appendSql( " like " );
|
||||||
|
appendSql( getDialect().getLowercaseFunction() );
|
||||||
|
appendSql( OPEN_PARENTHESIS );
|
||||||
|
renderBackslashEscapedLikePattern(
|
||||||
|
likePredicate.getPattern(),
|
||||||
|
likePredicate.getEscapeCharacter(),
|
||||||
|
getDialect().isNoBackslashEscapesEnabled()
|
||||||
|
);
|
||||||
|
appendSql( CLOSE_PARENTHESIS );
|
||||||
|
}
|
||||||
|
if ( likePredicate.getEscapeCharacter() != null ) {
|
||||||
|
appendSql( " escape " );
|
||||||
|
likePredicate.getEscapeCharacter().accept( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsRowValueConstructorSyntaxInSet() {
|
public boolean supportsRowValueConstructorSyntaxInSet() {
|
||||||
|
@ -196,4 +234,9 @@ public class MySQLSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlA
|
||||||
protected String getFromDual() {
|
protected String getFromDual() {
|
||||||
return " from dual";
|
return " from dual";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MySQLDialect getDialect() {
|
||||||
|
return (MySQLDialect) super.getDialect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue