Skip to content

Commit 9f13561

Browse files
committed
emulation for FETCH ... WITH TIES on Informix
1 parent 1d222ce commit 9f13561

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqlAstTranslator.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.sql.ast.tree.from.ValuesTableReference;
2222
import org.hibernate.sql.ast.tree.insert.ConflictClause;
2323
import org.hibernate.sql.ast.tree.insert.InsertSelectStatement;
24+
import org.hibernate.sql.ast.tree.select.QueryGroup;
2425
import org.hibernate.sql.ast.tree.select.QueryPart;
2526
import org.hibernate.sql.ast.tree.select.QuerySpec;
2627
import org.hibernate.sql.ast.tree.select.SelectClause;
@@ -60,11 +61,14 @@ protected void renderSelectExpression(Expression expression) {
6061

6162
@Override
6263
protected void visitSqlSelections(SelectClause selectClause) {
63-
if ( supportsSkipFirstClause() ) {
64-
renderSkipFirstClause( (QuerySpec) getQueryPartStack().getCurrent() );
65-
}
66-
else {
67-
renderFirstClause( (QuerySpec) getQueryPartStack().getCurrent() );
64+
final QuerySpec querySpec = (QuerySpec) getQueryPartStack().getCurrent();
65+
if ( isRowsOnlyFetchClauseType( querySpec ) ) {
66+
if ( supportsSkipFirstClause() ) {
67+
renderSkipFirstClause( querySpec );
68+
}
69+
else {
70+
renderFirstClause( querySpec );
71+
}
6872
}
6973
if ( selectClause.isDistinct() ) {
7074
appendSql( "distinct " );
@@ -195,4 +199,30 @@ protected void visitInsertStatementOnly(InsertSelectStatement statement) {
195199
public void visitValuesTableReference(ValuesTableReference tableReference) {
196200
emulateValuesTableReferenceColumnAliasing( tableReference );
197201
}
202+
203+
protected boolean shouldEmulateFetchClause(QueryPart queryPart) {
204+
// Check if current query part is already row numbering to avoid infinite recursion
205+
return useOffsetFetchClause( queryPart ) && getQueryPartForRowNumbering() != queryPart
206+
&& getDialect().supportsWindowFunctions() && !isRowsOnlyFetchClauseType( queryPart );
207+
}
208+
209+
@Override
210+
public void visitQueryGroup(QueryGroup queryGroup) {
211+
if ( shouldEmulateFetchClause( queryGroup ) ) {
212+
emulateFetchOffsetWithWindowFunctions( queryGroup, true );
213+
}
214+
else {
215+
super.visitQueryGroup( queryGroup );
216+
}
217+
}
218+
219+
@Override
220+
public void visitQuerySpec(QuerySpec querySpec) {
221+
if ( shouldEmulateFetchClause( querySpec ) ) {
222+
emulateFetchOffsetWithWindowFunctions( querySpec, true );
223+
}
224+
else {
225+
super.visitQuerySpec( querySpec );
226+
}
227+
}
198228
}

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,14 @@ protected void emulateFetchOffsetWithWindowFunctionsVisitQueryPart(QueryPart que
304304
}
305305
}
306306

307+
private boolean shouldEmulateFetch(QueryPart queryPart) {
308+
return shouldEmulateFetchClause( queryPart )
309+
|| getQueryPartForRowNumbering() != queryPart && !supportsOffsetClause() && hasOffset( queryPart );
310+
}
311+
307312
@Override
308313
public void visitQueryGroup(QueryGroup queryGroup) {
309-
final boolean emulateFetchClause = shouldEmulateFetchClause( queryGroup );
310-
if ( emulateFetchClause ||
311-
getQueryPartForRowNumbering() != queryGroup && !supportsOffsetClause() && hasOffset( queryGroup ) ) {
314+
if ( shouldEmulateFetch( queryGroup ) ) {
312315
emulateFetchOffsetWithWindowFunctions( queryGroup, true );
313316
}
314317
else {
@@ -318,9 +321,7 @@ public void visitQueryGroup(QueryGroup queryGroup) {
318321

319322
@Override
320323
public void visitQuerySpec(QuerySpec querySpec) {
321-
final boolean emulateFetchClause = shouldEmulateFetchClause( querySpec );
322-
if ( emulateFetchClause ||
323-
getQueryPartForRowNumbering() != querySpec && !supportsOffsetClause() && hasOffset( querySpec ) ) {
324+
if ( shouldEmulateFetch( querySpec ) ) {
324325
emulateFetchOffsetWithWindowFunctions( querySpec, true );
325326
}
326327
else {

0 commit comments

Comments
 (0)