Skip to content

Commit b0936fb

Browse files
committed
emulation for FETCH ... WITH TIES on Informix
1 parent 35c74b6 commit b0936fb

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
@@ -23,6 +23,7 @@
2323
import org.hibernate.sql.ast.tree.from.ValuesTableReference;
2424
import org.hibernate.sql.ast.tree.insert.ConflictClause;
2525
import org.hibernate.sql.ast.tree.insert.InsertSelectStatement;
26+
import org.hibernate.sql.ast.tree.select.QueryGroup;
2627
import org.hibernate.sql.ast.tree.select.QueryPart;
2728
import org.hibernate.sql.ast.tree.select.QuerySpec;
2829
import org.hibernate.sql.ast.tree.select.SelectClause;
@@ -62,11 +63,14 @@ protected void renderSelectExpression(Expression expression) {
6263

6364
@Override
6465
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+
}
7074
}
7175
if ( selectClause.isDistinct() ) {
7276
appendSql( "distinct " );
@@ -198,6 +202,32 @@ public void visitValuesTableReference(ValuesTableReference tableReference) {
198202
emulateValuesTableReferenceColumnAliasing( tableReference );
199203
}
200204

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+
201231
private void caseArgument(Expression expression) {
202232
// concatenation inside a case must be cast to varchar(255)
203233
// or we get a bunch of trailing whitespace

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)