|
23 | 23 | import org.hibernate.sql.ast.tree.from.ValuesTableReference;
|
24 | 24 | import org.hibernate.sql.ast.tree.insert.ConflictClause;
|
25 | 25 | import org.hibernate.sql.ast.tree.insert.InsertSelectStatement;
|
| 26 | +import org.hibernate.sql.ast.tree.select.QueryGroup; |
26 | 27 | import org.hibernate.sql.ast.tree.select.QueryPart;
|
27 | 28 | import org.hibernate.sql.ast.tree.select.QuerySpec;
|
28 | 29 | import org.hibernate.sql.ast.tree.select.SelectClause;
|
@@ -62,11 +63,14 @@ protected void renderSelectExpression(Expression expression) {
|
62 | 63 |
|
63 | 64 | @Override
|
64 | 65 | protected void visitSqlSelections(SelectClause selectClause) {
|
65 |
| - if ( supportsSkipFirstClause() ) { |
66 |
| - renderSkipFirstClause( (QuerySpec) getQueryPartStack().getCurrent() ); |
67 |
| - } |
68 |
| - else { |
69 |
| - renderFirstClause( (QuerySpec) getQueryPartStack().getCurrent() ); |
| 66 | + final QuerySpec querySpec = (QuerySpec) getQueryPartStack().getCurrent(); |
| 67 | + if ( isRowsOnlyFetchClauseType( querySpec ) ) { |
| 68 | + if ( supportsSkipFirstClause() ) { |
| 69 | + renderSkipFirstClause( querySpec ); |
| 70 | + } |
| 71 | + else { |
| 72 | + renderFirstClause( querySpec ); |
| 73 | + } |
70 | 74 | }
|
71 | 75 | if ( selectClause.isDistinct() ) {
|
72 | 76 | appendSql( "distinct " );
|
@@ -198,6 +202,32 @@ public void visitValuesTableReference(ValuesTableReference tableReference) {
|
198 | 202 | emulateValuesTableReferenceColumnAliasing( tableReference );
|
199 | 203 | }
|
200 | 204 |
|
| 205 | + protected boolean shouldEmulateFetchClause(QueryPart queryPart) { |
| 206 | + // Check if current query part is already row numbering to avoid infinite recursion |
| 207 | + return useOffsetFetchClause( queryPart ) && getQueryPartForRowNumbering() != queryPart |
| 208 | + && getDialect().supportsWindowFunctions() && !isRowsOnlyFetchClauseType( queryPart ); |
| 209 | + } |
| 210 | + |
| 211 | + @Override |
| 212 | + public void visitQueryGroup(QueryGroup queryGroup) { |
| 213 | + if ( shouldEmulateFetchClause( queryGroup ) ) { |
| 214 | + emulateFetchOffsetWithWindowFunctions( queryGroup, true ); |
| 215 | + } |
| 216 | + else { |
| 217 | + super.visitQueryGroup( queryGroup ); |
| 218 | + } |
| 219 | + } |
| 220 | + |
| 221 | + @Override |
| 222 | + public void visitQuerySpec(QuerySpec querySpec) { |
| 223 | + if ( shouldEmulateFetchClause( querySpec ) ) { |
| 224 | + emulateFetchOffsetWithWindowFunctions( querySpec, true ); |
| 225 | + } |
| 226 | + else { |
| 227 | + super.visitQuerySpec( querySpec ); |
| 228 | + } |
| 229 | + } |
| 230 | + |
201 | 231 | private void caseArgument(Expression expression) {
|
202 | 232 | // concatenation inside a case must be cast to varchar(255)
|
203 | 233 | // or we get a bunch of trailing whitespace
|
|
0 commit comments