HHH-15805 Subquery with where condition on a column with columnDefinition results in wrong SQL grammer
This commit is contained in:
parent
62b218d411
commit
1f630e4a5d
|
@ -6,10 +6,12 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.community.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.MySQLSqlAstTranslator;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
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;
|
||||||
|
@ -227,4 +229,15 @@ public class MariaDBLegacySqlAstTranslator<T extends JdbcOperation> extends Abst
|
||||||
private boolean supportsWindowFunctions() {
|
private boolean supportsWindowFunctions() {
|
||||||
return dialect.getVersion().isSameOrAfter( 10, 2 );
|
return dialect.getVersion().isSameOrAfter( 10, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitCastTarget(CastTarget castTarget) {
|
||||||
|
String sqlType = MySQLSqlAstTranslator.getSqlType( castTarget, dialect );
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
appendSql( sqlType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitCastTarget( castTarget );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,12 @@
|
||||||
package org.hibernate.community.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.dialect.MySQLDialect;
|
import org.hibernate.dialect.MySQLDialect;
|
||||||
|
import org.hibernate.dialect.MySQLSqlAstTranslator;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
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;
|
||||||
|
@ -240,4 +242,15 @@ public class MySQLLegacySqlAstTranslator<T extends JdbcOperation> extends Abstra
|
||||||
public MySQLDialect getDialect() {
|
public MySQLDialect getDialect() {
|
||||||
return (MySQLDialect) super.getDialect();
|
return (MySQLDialect) super.getDialect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitCastTarget(CastTarget castTarget) {
|
||||||
|
String sqlType = MySQLSqlAstTranslator.getSqlType( castTarget, getDialect() );
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
appendSql( sqlType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitCastTarget( castTarget );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
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;
|
||||||
|
@ -222,4 +223,16 @@ public class MariaDBSqlAstTranslator<T extends JdbcOperation> extends AbstractSq
|
||||||
private boolean supportsWindowFunctions() {
|
private boolean supportsWindowFunctions() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitCastTarget(CastTarget castTarget) {
|
||||||
|
String sqlType = MySQLSqlAstTranslator.getSqlType( castTarget, dialect );
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
appendSql( sqlType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitCastTarget( castTarget );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,14 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.dialect;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import org.hibernate.engine.jdbc.Size;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
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;
|
||||||
|
@ -33,6 +37,41 @@ public class MySQLSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlA
|
||||||
super( sessionFactory, statement );
|
super( sessionFactory, statement );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getSqlType(CastTarget castTarget, Dialect dialect) {
|
||||||
|
final String sqlType = castTarget.getSqlType();
|
||||||
|
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
int parenthesesIndex = sqlType.indexOf( '(' );
|
||||||
|
final String baseName = parenthesesIndex == -1 ? sqlType : sqlType.substring( 0, parenthesesIndex );
|
||||||
|
switch ( baseName.toLowerCase( Locale.ROOT ) ) {
|
||||||
|
case "bit":
|
||||||
|
return "unsigned";
|
||||||
|
case "tinyint":
|
||||||
|
case "smallint":
|
||||||
|
case "integer":
|
||||||
|
case "bigint":
|
||||||
|
return "signed";
|
||||||
|
case "float":
|
||||||
|
case "real":
|
||||||
|
case "double precision":
|
||||||
|
final int precision = castTarget.getPrecision() == null ?
|
||||||
|
dialect.getDefaultDecimalPrecision() :
|
||||||
|
castTarget.getPrecision();
|
||||||
|
final int scale = castTarget.getScale() == null ? Size.DEFAULT_SCALE : castTarget.getScale();
|
||||||
|
return "decimal(" + precision + "," + scale + ")";
|
||||||
|
case "char":
|
||||||
|
case "varchar":
|
||||||
|
case "nchar":
|
||||||
|
case "nvarchar":
|
||||||
|
return "char";
|
||||||
|
case "binary":
|
||||||
|
case "varbinary":
|
||||||
|
return "binary";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sqlType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderExpressionAsClauseItem(Expression expression) {
|
protected void renderExpressionAsClauseItem(Expression expression) {
|
||||||
expression.accept( this );
|
expression.accept( this );
|
||||||
|
@ -239,4 +278,15 @@ public class MySQLSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlA
|
||||||
public MySQLDialect getDialect() {
|
public MySQLDialect getDialect() {
|
||||||
return (MySQLDialect) super.getDialect();
|
return (MySQLDialect) super.getDialect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitCastTarget(CastTarget castTarget) {
|
||||||
|
String sqlType = getSqlType( castTarget, getDialect() );
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
appendSql( sqlType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitCastTarget( castTarget );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.query.sqm.ComparisonOperator;
|
import org.hibernate.query.sqm.ComparisonOperator;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.CastTarget;
|
||||||
import org.hibernate.sql.ast.tree.expression.Expression;
|
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;
|
||||||
|
@ -189,4 +190,15 @@ public class TiDBSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlAs
|
||||||
public TiDBDialect getDialect() {
|
public TiDBDialect getDialect() {
|
||||||
return this.dialect;
|
return this.dialect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitCastTarget(CastTarget castTarget) {
|
||||||
|
String sqlType = MySQLSqlAstTranslator.getSqlType( castTarget, dialect );
|
||||||
|
if ( sqlType != null ) {
|
||||||
|
appendSql( sqlType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitCastTarget( castTarget );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -943,8 +943,10 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitSelectStatement(SelectStatement statement) {
|
public void visitSelectStatement(SelectStatement statement) {
|
||||||
|
final SqlAstNodeRenderingMode oldParameterRenderingMode = getParameterRenderingMode();
|
||||||
try {
|
try {
|
||||||
statementStack.push( statement );
|
statementStack.push( statement );
|
||||||
|
parameterRenderingMode = SqlAstNodeRenderingMode.DEFAULT;
|
||||||
final boolean needsParenthesis = !statement.getQueryPart().isRoot();
|
final boolean needsParenthesis = !statement.getQueryPart().isRoot();
|
||||||
if ( needsParenthesis ) {
|
if ( needsParenthesis ) {
|
||||||
appendSql( OPEN_PARENTHESIS );
|
appendSql( OPEN_PARENTHESIS );
|
||||||
|
@ -956,6 +958,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
parameterRenderingMode = oldParameterRenderingMode;
|
||||||
statementStack.pop();
|
statementStack.pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue