|
25 | 25 | import org.hibernate.sql.ast.tree.from.DerivedTableReference; |
26 | 26 | import org.hibernate.sql.ast.tree.from.NamedTableReference; |
27 | 27 | import org.hibernate.sql.ast.tree.from.QueryPartTableReference; |
| 28 | +import org.hibernate.sql.ast.tree.from.TableReference; |
28 | 29 | import org.hibernate.sql.ast.tree.insert.ConflictClause; |
29 | 30 | import org.hibernate.sql.ast.tree.insert.InsertSelectStatement; |
30 | 31 | import org.hibernate.sql.ast.tree.predicate.BooleanExpressionPredicate; |
@@ -117,7 +118,9 @@ protected void renderDeleteClause(DeleteStatement statement) { |
117 | 118 | final Stack<Clause> clauseStack = getClauseStack(); |
118 | 119 | try { |
119 | 120 | clauseStack.push( Clause.DELETE ); |
120 | | - renderTableReferenceIdentificationVariable( statement.getTargetTable() ); |
| 121 | + if ( supportsDeleteTableVariable() ) { |
| 122 | + renderTableReferenceIdentificationVariable( statement.getTargetTable() ); |
| 123 | + } |
121 | 124 | if ( statement.getFromClause().getRoots().isEmpty() ) { |
122 | 125 | appendSql( " from " ); |
123 | 126 | renderDmlTargetTableExpression( statement.getTargetTable() ); |
@@ -145,11 +148,28 @@ protected void renderUpdateClause(UpdateStatement updateStatement) { |
145 | 148 | @Override |
146 | 149 | protected void renderDmlTargetTableExpression(NamedTableReference tableReference) { |
147 | 150 | 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()) ) { |
149 | 154 | renderTableReferenceIdentificationVariable( tableReference ); |
150 | 155 | } |
151 | 156 | } |
152 | 157 |
|
| 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 | + |
153 | 173 | @Override |
154 | 174 | protected JdbcOperationQueryInsert translateInsert(InsertSelectStatement sqlAst) { |
155 | 175 | visitInsertStatement( sqlAst ); |
@@ -178,7 +198,10 @@ protected String determineColumnReferenceQualifier(ColumnReference columnReferen |
178 | 198 | || !( getCurrentDmlStatement() instanceof InsertSelectStatement insertSelectStatement ) |
179 | 199 | || ( dmlAlias = insertSelectStatement.getTargetTable().getIdentificationVariable() ) == null |
180 | 200 | || !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(); |
182 | 205 | } |
183 | 206 | // Qualify the column reference with the table expression also when in subqueries |
184 | 207 | else if ( qualifierSupport != DmlTargetColumnQualifierSupport.NONE || !getQueryPartStack().isEmpty() ) { |
|
0 commit comments