Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package org.hibernate.community.dialect.pagination;

import org.hibernate.dialect.pagination.LimitLimitHandler;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

/**
* Limit handler for {@link org.hibernate.community.dialect.AltibaseDialect}.
Expand All @@ -19,8 +20,24 @@ protected String limitClause(boolean hasFirstRow) {
return hasFirstRow ? " limit 1+?,?" : " limit ?";
}

@Override
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
if ( hasFirstRow ) {
return " limit 1+" + firstParameter + "," + parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
}
else {
return " limit " + firstParameter;
}
}

@Override
protected String offsetOnlyClause() {
return " limit 1+?," + Integer.MAX_VALUE;
}

@Override
protected String offsetOnlyClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
return " limit 1+" + parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null ) + "," + Integer.MAX_VALUE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import org.hibernate.dialect.pagination.AbstractNoOffsetLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

/**
* A {@link LimitHandler} for older versions of Informix, Ingres,
Expand All @@ -27,6 +29,11 @@ protected String limitClause() {
return " first ?";
}

@Override
protected String limitClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
return " first " + parameterMarkerStrategy.createMarker( 1, null ) + " rows only";
}

@Override
protected String insert(String first, String sql) {
return insertAfterSelect( first, sql );
Expand All @@ -36,4 +43,14 @@ protected String insert(String first, String sql) {
public boolean bindLimitParametersFirst() {
return true;
}

@Override
public boolean processSqlMutatesState() {
return false;
}

@Override
public int getParameterPositionStart(Limit limit) {
return hasMaxRows( limit ) && supportsVariableLimit() ? 2 : 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@
*/
package org.hibernate.community.dialect.pagination;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

/**
* A {@link LimitHandler} for Firebird 2.5 and older which supports the syntax
Expand All @@ -18,6 +22,15 @@ public class FirstSkipLimitHandler extends AbstractLimitHandler {

@Override
public String processSql(String sql, Limit limit) {
return processSql( sql, -1, null, limit );
}

@Override
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
return processSql( sql, jdbcParameterCount, parameterMarkerStrategy, queryOptions.getLimit() );
}

private String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, Limit limit) {
boolean hasFirstRow = hasFirstRow( limit );
boolean hasMaxRows = hasMaxRows( limit );

Expand All @@ -27,13 +40,26 @@ public String processSql(String sql, Limit limit) {

StringBuilder skipFirst = new StringBuilder();

if ( hasMaxRows ) {
skipFirst.append( " first ?" );
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
if ( hasMaxRows ) {
skipFirst.append( " first ?" );
}
if ( hasFirstRow ) {
skipFirst.append( " skip ?" );
}
}
if ( hasFirstRow ) {
skipFirst.append( " skip ?" );
else {
String marker = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
if ( hasMaxRows ) {
skipFirst.append( " first " );
skipFirst.append( marker );
marker = parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
}
if ( hasFirstRow ) {
skipFirst.append( " skip " );
skipFirst.append( marker );
}
}

return insertAfterSelect( skipFirst.toString(), sql );
}

Expand All @@ -57,4 +83,16 @@ public final boolean bindLimitParametersFirst() {
return true;
}

@Override
public boolean processSqlMutatesState() {
return false;
}

@Override
public int getParameterPositionStart(Limit limit) {
return hasMaxRows( limit )
? hasFirstRow( limit ) ? 3 : 2
: hasFirstRow( limit ) ? 2 : 1;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

/**
* A {@link LimitHandler} for HSQL prior to 2.0.
Expand All @@ -19,6 +21,17 @@ protected String limitClause(boolean hasFirstRow) {
return hasFirstRow ? " limit ? ?" : " top ?";
}

@Override
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
final String firstParameter = parameterMarkerStrategy.createMarker( 1, null );
if ( hasFirstRow ) {
return " limit 1+" + firstParameter + " " + parameterMarkerStrategy.createMarker( 2, null );
}
else {
return " top " + firstParameter;
}
}

@Override
protected String insert(String limitOrTop, String sql) {
return insertAfterSelect( limitOrTop, sql );
Expand All @@ -28,4 +41,16 @@ protected String insert(String limitOrTop, String sql) {
public final boolean bindLimitParametersFirst() {
return true;
}

@Override
public boolean processSqlMutatesState() {
return false;
}

@Override
public int getParameterPositionStart(Limit limit) {
return hasMaxRows( limit )
? hasFirstRow( limit ) ? 3 : 2
: hasFirstRow( limit ) ? 2 : 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
*/
package org.hibernate.community.dialect.pagination;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

import java.util.regex.Matcher;

Expand All @@ -23,6 +27,15 @@ public LegacyOracleLimitHandler(DatabaseVersion version) {

@Override
public String processSql(String sql, Limit limit) {
return processSql( sql, -1, limit, null );
}

@Override
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
return processSql( sql, jdbcParameterCount, queryOptions.getLimit(), parameterMarkerStrategy );
}

private String processSql(String sql, int jdbcParameterCount, @Nullable Limit limit, @Nullable ParameterMarkerStrategy parameterMarkerStrategy) {
final boolean hasOffset = hasFirstRow( limit );
sql = sql.trim();

Expand All @@ -36,17 +49,42 @@ public String processSql(String sql, Limit limit) {
}

final StringBuilder pagingSelect = new StringBuilder( sql.length() + 100 );
if ( hasOffset ) {
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
if ( version.isBefore( 9 ) ) {
pagingSelect.append( ") row_) where rownum_<=? and rownum_>?" );
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
if ( hasOffset ) {
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
if ( version.isBefore( 9 ) ) {
pagingSelect.append( ") row_) where rownum_<=? and rownum_>?" );
}
else {
pagingSelect.append( ") row_ where rownum<=?) where rownum_>?" );
}
}
else {
pagingSelect.append( ") row_ where rownum<=?) where rownum_>?" );
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=?" );
}
}
else {
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=?" );
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
if ( hasOffset ) {
final String secondParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
if ( version.isBefore( 9 ) ) {
pagingSelect.append( ") row_) where rownum_<=" );
pagingSelect.append( firstParameter );
pagingSelect.append( " and rownum_>" );
pagingSelect.append( secondParameter );
}
else {
pagingSelect.append( ") row_ where rownum<=" );
pagingSelect.append( firstParameter );
pagingSelect.append( ") where rownum_>" );
pagingSelect.append( secondParameter );
}
}
else {
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=" );
pagingSelect.append( firstParameter );
}
}

if ( forUpdateClause != null ) {
Expand Down Expand Up @@ -80,4 +118,9 @@ public boolean bindLimitParametersInReverseOrder() {
public boolean useMaxForLimit() {
return true;
}

@Override
public boolean processSqlMutatesState() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.compile;
Expand All @@ -29,11 +30,27 @@ protected String limitClause(boolean hasFirstRow) {
return hasFirstRow ? " rows ? to ?" : " rows ?";
}

@Override
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
if ( hasFirstRow ) {
return " rows " + firstParameter + " to " + parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
}
else {
return " rows " + firstParameter;
}
}

@Override
protected String offsetOnlyClause() {
return " rows ? to " + Integer.MAX_VALUE;
}

@Override
protected String offsetOnlyClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
return " rows " + parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null ) + " to " + Integer.MAX_VALUE;
}

@Override
public final boolean useMaxForLimit() {
return true;
Expand All @@ -56,4 +73,9 @@ protected Pattern getForUpdatePattern() {
public boolean supportsOffset() {
return true;
}

@Override
public boolean processSqlMutatesState() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.query.spi.Limit;
import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;

import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.compile;
Expand Down Expand Up @@ -80,6 +84,15 @@ public int convertToFirstRowValue(int zeroBasedFirstResult) {
*/
@Override
public String processSql(String sql, Limit limit) {
return processSql( sql, -1, null, limit );
}

@Override
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
return processSql( sql, jdbcParameterCount, parameterMarkerStrategy, queryOptions.getLimit() );
}

private String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, @Nullable Limit limit) {
sql = sql.trim();
if ( sql.endsWith(";") ) {
sql = sql.substring( 0, sql.length()-1 );
Expand All @@ -96,7 +109,13 @@ public String processSql(String sql, Limit limit) {
final StringBuilder result = new StringBuilder( sql );

if ( !hasFirstRow || hasOrderBy ) {
result.insert( afterSelectOffset, " top(?)" );
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
result.insert( afterSelectOffset, " top(?)" );
}
else {
final String parameterMarker = parameterMarkerStrategy.createMarker( 1, null );
result.insert( afterSelectOffset, " top(" + parameterMarker + ")" );
}
topAdded = true;
}

Expand All @@ -109,7 +128,16 @@ public String processSql(String sql, Limit limit) {
result.insert( selectOffset, ( hasCommonTables ? "," : "with" )
+ " query_ as (select row_.*,row_number() over (order by current_timestamp) as rownumber_ from (" )
.append( ") row_) select " ).append( aliases )
.append( " from query_ where rownumber_>=? and rownumber_<?" );
.append( " from query_ where rownumber_>=" );
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
result.append( "? and rownumber_<?" );
}
else {
final int firstPosition = jdbcParameterCount + 1 + ( topAdded ? 1 : 0 );
result.append( parameterMarkerStrategy.createMarker( firstPosition, null ) );
result.append( " and rownumber_<" );
result.append( parameterMarkerStrategy.createMarker( firstPosition + 1, null ) );
}
}

return result.toString();
Expand Down
Loading