Skip to content

Commit 078a452

Browse files
committed
Handle lack of alias support for delete statements in MariaDB before version 11.6
1 parent 41d8b3a commit 078a452

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/sql/ast/MariaDBSqlAstTranslator.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.hibernate.sql.ast.tree.from.DerivedTableReference;
2626
import org.hibernate.sql.ast.tree.from.NamedTableReference;
2727
import org.hibernate.sql.ast.tree.from.QueryPartTableReference;
28+
import org.hibernate.sql.ast.tree.from.TableReference;
2829
import org.hibernate.sql.ast.tree.insert.ConflictClause;
2930
import org.hibernate.sql.ast.tree.insert.InsertSelectStatement;
3031
import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate;
@@ -117,7 +118,9 @@ protected void renderDeleteClause(DeleteStatement statement) {
117118
final Stack<Clause> clauseStack = getClauseStack();
118119
try {
119120
clauseStack.push( Clause.DELETE );
120-
renderTableReferenceIdentificationVariable( statement.getTargetTable() );
121+
if ( supportsDeleteTableVariable() ) {
122+
renderTableReferenceIdentificationVariable( statement.getTargetTable() );
123+
}
121124
if ( statement.getFromClause().getRoots().isEmpty() ) {
122125
appendSql( " from " );
123126
renderDmlTargetTableExpression( statement.getTargetTable() );
@@ -145,11 +148,28 @@ protected void renderUpdateClause(UpdateStatement updateStatement) {
145148
@Override
146149
protected void renderDmlTargetTableExpression(NamedTableReference tableReference) {
147150
super.renderDmlTargetTableExpression( tableReference );
148-
if ( getClauseStack().getCurrent() != Clause.INSERT ) {
151+
final Clause currentClause = getClauseStack().getCurrent();
152+
if ( getClauseStack().getCurrent() != Clause.INSERT
153+
&& (currentClause != Clause.DELETE || supportsDeleteTableVariable()) ) {
149154
renderTableReferenceIdentificationVariable( tableReference );
150155
}
151156
}
152157

158+
@Override
159+
protected void renderTableReferenceIdentificationVariable(TableReference tableReference) {
160+
final Stack<Clause> clauseStack = getCurrentClauseStack();
161+
if ( clauseStack.getCurrent() == Clause.FROM && clauseStack.depth() > 1
162+
&& clauseStack.peek( 1 ) == Clause.DELETE && !supportsDeleteTableVariable() ) {
163+
return;
164+
}
165+
super.renderTableReferenceIdentificationVariable( tableReference );
166+
}
167+
168+
private boolean supportsDeleteTableVariable() {
169+
// Until 11.6, a DELETE statement doesn't support aliasing tables
170+
return getDialect().getVersion().isSameOrAfter( 11, 6 );
171+
}
172+
153173
@Override
154174
protected JdbcOperationQueryInsert translateInsert(InsertSelectStatement sqlAst) {
155175
visitInsertStatement( sqlAst );
@@ -178,7 +198,10 @@ protected String determineColumnReferenceQualifier(ColumnReference columnReferen
178198
|| !( getCurrentDmlStatement() instanceof InsertSelectStatement insertSelectStatement )
179199
|| ( dmlAlias = insertSelectStatement.getTargetTable().getIdentificationVariable() ) == null
180200
|| !dmlAlias.equals( columnReference.getQualifier() ) ) {
181-
return columnReference.getQualifier();
201+
return !supportsDeleteTableVariable() && getCurrentDmlStatement() instanceof DeleteStatement statement
202+
&& statement.getTargetTable().getIdentificationVariable().equals( columnReference.getQualifier() )
203+
? getCurrentDmlStatement().getTargetTable().getTableExpression()
204+
: columnReference.getQualifier();
182205
}
183206
// Qualify the column reference with the table expression also when in subqueries
184207
else if ( qualifierSupport != DmlTargetColumnQualifierSupport.NONE || !getQueryPartStack().isEmpty() ) {

0 commit comments

Comments
 (0)