Skip to content

Commit 254dcfc

Browse files
committed
HHH-16283 Integrate ParameterMarkerStrategy into NativeQuery
1 parent 9683a0c commit 254dcfc

File tree

42 files changed

+1057
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1057
-172
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/AltibaseLimitHandler.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.community.dialect.pagination;
66

77
import org.hibernate.dialect.pagination.LimitLimitHandler;
8+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
89

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

23+
@Override
24+
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
25+
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
26+
if ( hasFirstRow ) {
27+
return " limit 1+" + firstParameter + "," + parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
28+
}
29+
else {
30+
return " limit " + firstParameter;
31+
}
32+
}
33+
2234
@Override
2335
protected String offsetOnlyClause() {
2436
return " limit 1+?," + Integer.MAX_VALUE;
2537
}
38+
39+
@Override
40+
protected String offsetOnlyClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
41+
return " limit 1+" + parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null ) + "," + Integer.MAX_VALUE;
42+
}
2643
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/FirstLimitHandler.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import org.hibernate.dialect.pagination.AbstractNoOffsetLimitHandler;
88
import org.hibernate.dialect.pagination.LimitHandler;
9+
import org.hibernate.query.spi.Limit;
10+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
911

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

32+
@Override
33+
protected String limitClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
34+
return " first " + parameterMarkerStrategy.createMarker( 1, null ) + " rows only";
35+
}
36+
3037
@Override
3138
protected String insert(String first, String sql) {
3239
return insertAfterSelect( first, sql );
@@ -36,4 +43,14 @@ protected String insert(String first, String sql) {
3643
public boolean bindLimitParametersFirst() {
3744
return true;
3845
}
46+
47+
@Override
48+
public boolean processSqlMutatesState() {
49+
return false;
50+
}
51+
52+
@Override
53+
public int getParameterPositionStart(Limit limit) {
54+
return hasMaxRows( limit ) && supportsVariableLimit() ? 2 : 1;
55+
}
3956
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/FirstSkipLimitHandler.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
*/
55
package org.hibernate.community.dialect.pagination;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
78
import org.hibernate.dialect.pagination.AbstractLimitHandler;
89
import org.hibernate.dialect.pagination.LimitHandler;
910
import org.hibernate.query.spi.Limit;
11+
import org.hibernate.query.spi.QueryOptions;
12+
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
13+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
1014

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

1923
@Override
2024
public String processSql(String sql, Limit limit) {
25+
return processSql( sql, -1, null, limit );
26+
}
27+
28+
@Override
29+
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
30+
return processSql( sql, jdbcParameterCount, parameterMarkerStrategy, queryOptions.getLimit() );
31+
}
32+
33+
private String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, Limit limit) {
2134
boolean hasFirstRow = hasFirstRow( limit );
2235
boolean hasMaxRows = hasMaxRows( limit );
2336

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

2841
StringBuilder skipFirst = new StringBuilder();
2942

30-
if ( hasMaxRows ) {
31-
skipFirst.append( " first ?" );
43+
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
44+
if ( hasMaxRows ) {
45+
skipFirst.append( " first ?" );
46+
}
47+
if ( hasFirstRow ) {
48+
skipFirst.append( " skip ?" );
49+
}
3250
}
33-
if ( hasFirstRow ) {
34-
skipFirst.append( " skip ?" );
51+
else {
52+
String marker = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
53+
if ( hasMaxRows ) {
54+
skipFirst.append( " first " );
55+
skipFirst.append( marker );
56+
marker = parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
57+
}
58+
if ( hasFirstRow ) {
59+
skipFirst.append( " skip " );
60+
skipFirst.append( marker );
61+
}
3562
}
36-
3763
return insertAfterSelect( skipFirst.toString(), sql );
3864
}
3965

@@ -57,4 +83,16 @@ public final boolean bindLimitParametersFirst() {
5783
return true;
5884
}
5985

86+
@Override
87+
public boolean processSqlMutatesState() {
88+
return false;
89+
}
90+
91+
@Override
92+
public int getParameterPositionStart(Limit limit) {
93+
return hasMaxRows( limit )
94+
? hasFirstRow( limit ) ? 3 : 2
95+
: hasFirstRow( limit ) ? 2 : 1;
96+
}
97+
6098
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/LegacyHSQLLimitHandler.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
88
import org.hibernate.dialect.pagination.LimitHandler;
9+
import org.hibernate.query.spi.Limit;
10+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
911

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

24+
@Override
25+
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
26+
final String firstParameter = parameterMarkerStrategy.createMarker( 1, null );
27+
if ( hasFirstRow ) {
28+
return " limit 1+" + firstParameter + " " + parameterMarkerStrategy.createMarker( 2, null );
29+
}
30+
else {
31+
return " top " + firstParameter;
32+
}
33+
}
34+
2235
@Override
2336
protected String insert(String limitOrTop, String sql) {
2437
return insertAfterSelect( limitOrTop, sql );
@@ -28,4 +41,16 @@ protected String insert(String limitOrTop, String sql) {
2841
public final boolean bindLimitParametersFirst() {
2942
return true;
3043
}
44+
45+
@Override
46+
public boolean processSqlMutatesState() {
47+
return false;
48+
}
49+
50+
@Override
51+
public int getParameterPositionStart(Limit limit) {
52+
return hasMaxRows( limit )
53+
? hasFirstRow( limit ) ? 3 : 2
54+
: hasFirstRow( limit ) ? 2 : 1;
55+
}
3156
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/LegacyOracleLimitHandler.java

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
*/
55
package org.hibernate.community.dialect.pagination;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
78
import org.hibernate.dialect.DatabaseVersion;
89
import org.hibernate.dialect.pagination.AbstractLimitHandler;
910
import org.hibernate.dialect.pagination.LimitHandler;
1011
import org.hibernate.query.spi.Limit;
12+
import org.hibernate.query.spi.QueryOptions;
13+
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
14+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
1115

1216
import java.util.regex.Matcher;
1317

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

2428
@Override
2529
public String processSql(String sql, Limit limit) {
30+
return processSql( sql, -1, limit, null );
31+
}
32+
33+
@Override
34+
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
35+
return processSql( sql, jdbcParameterCount, queryOptions.getLimit(), parameterMarkerStrategy );
36+
}
37+
38+
private String processSql(String sql, int jdbcParameterCount, @Nullable Limit limit, @Nullable ParameterMarkerStrategy parameterMarkerStrategy) {
2639
final boolean hasOffset = hasFirstRow( limit );
2740
sql = sql.trim();
2841

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

3851
final StringBuilder pagingSelect = new StringBuilder( sql.length() + 100 );
39-
if ( hasOffset ) {
40-
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
41-
if ( version.isBefore( 9 ) ) {
42-
pagingSelect.append( ") row_) where rownum_<=? and rownum_>?" );
52+
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
53+
if ( hasOffset ) {
54+
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
55+
if ( version.isBefore( 9 ) ) {
56+
pagingSelect.append( ") row_) where rownum_<=? and rownum_>?" );
57+
}
58+
else {
59+
pagingSelect.append( ") row_ where rownum<=?) where rownum_>?" );
60+
}
4361
}
4462
else {
45-
pagingSelect.append( ") row_ where rownum<=?) where rownum_>?" );
63+
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=?" );
4664
}
4765
}
4866
else {
49-
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=?" );
67+
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
68+
if ( hasOffset ) {
69+
final String secondParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
70+
pagingSelect.append( "select * from (select row_.*,rownum rownum_ from (" ).append( sql );
71+
if ( version.isBefore( 9 ) ) {
72+
pagingSelect.append( ") row_) where rownum_<=" );
73+
pagingSelect.append( firstParameter );
74+
pagingSelect.append( " and rownum_>" );
75+
pagingSelect.append( secondParameter );
76+
}
77+
else {
78+
pagingSelect.append( ") row_ where rownum<=" );
79+
pagingSelect.append( firstParameter );
80+
pagingSelect.append( ") where rownum_>" );
81+
pagingSelect.append( secondParameter );
82+
}
83+
}
84+
else {
85+
pagingSelect.append( "select * from (" ).append( sql ).append( ") where rownum<=" );
86+
pagingSelect.append( firstParameter );
87+
}
5088
}
5189

5290
if ( forUpdateClause != null ) {
@@ -80,4 +118,9 @@ public boolean bindLimitParametersInReverseOrder() {
80118
public boolean useMaxForLimit() {
81119
return true;
82120
}
121+
122+
@Override
123+
public boolean processSqlMutatesState() {
124+
return false;
125+
}
83126
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/RowsLimitHandler.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
1010
import org.hibernate.dialect.pagination.LimitHandler;
11+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
1112

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

33+
@Override
34+
protected String limitClause(boolean hasFirstRow, int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
35+
final String firstParameter = parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null );
36+
if ( hasFirstRow ) {
37+
return " rows " + firstParameter + " to " + parameterMarkerStrategy.createMarker( jdbcParameterCount + 2, null );
38+
}
39+
else {
40+
return " rows " + firstParameter;
41+
}
42+
}
43+
3244
@Override
3345
protected String offsetOnlyClause() {
3446
return " rows ? to " + Integer.MAX_VALUE;
3547
}
3648

49+
@Override
50+
protected String offsetOnlyClause(int jdbcParameterCount, ParameterMarkerStrategy parameterMarkerStrategy) {
51+
return " rows " + parameterMarkerStrategy.createMarker( jdbcParameterCount + 1, null ) + " to " + Integer.MAX_VALUE;
52+
}
53+
3754
@Override
3855
public final boolean useMaxForLimit() {
3956
return true;
@@ -56,4 +73,9 @@ protected Pattern getForUpdatePattern() {
5673
public boolean supportsOffset() {
5774
return true;
5875
}
76+
77+
@Override
78+
public boolean processSqlMutatesState() {
79+
return false;
80+
}
5981
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/pagination/SQLServer2005LimitHandler.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@
1111
import java.util.regex.Matcher;
1212
import java.util.regex.Pattern;
1313

14+
import org.checkerframework.checker.nullness.qual.Nullable;
1415
import org.hibernate.dialect.pagination.AbstractLimitHandler;
1516
import org.hibernate.dialect.pagination.LimitHandler;
1617
import org.hibernate.internal.util.StringHelper;
1718
import org.hibernate.query.spi.Limit;
19+
import org.hibernate.query.spi.QueryOptions;
20+
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
21+
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
1822

1923
import static java.util.regex.Pattern.CASE_INSENSITIVE;
2024
import static java.util.regex.Pattern.compile;
@@ -80,6 +84,15 @@ public int convertToFirstRowValue(int zeroBasedFirstResult) {
8084
*/
8185
@Override
8286
public String processSql(String sql, Limit limit) {
87+
return processSql( sql, -1, null, limit );
88+
}
89+
90+
@Override
91+
public String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, QueryOptions queryOptions) {
92+
return processSql( sql, jdbcParameterCount, parameterMarkerStrategy, queryOptions.getLimit() );
93+
}
94+
95+
private String processSql(String sql, int jdbcParameterCount, @Nullable ParameterMarkerStrategy parameterMarkerStrategy, @Nullable Limit limit) {
8396
sql = sql.trim();
8497
if ( sql.endsWith(";") ) {
8598
sql = sql.substring( 0, sql.length()-1 );
@@ -96,7 +109,13 @@ public String processSql(String sql, Limit limit) {
96109
final StringBuilder result = new StringBuilder( sql );
97110

98111
if ( !hasFirstRow || hasOrderBy ) {
99-
result.insert( afterSelectOffset, " top(?)" );
112+
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
113+
result.insert( afterSelectOffset, " top(?)" );
114+
}
115+
else {
116+
final String parameterMarker = parameterMarkerStrategy.createMarker( 1, null );
117+
result.insert( afterSelectOffset, " top(" + parameterMarker + ")" );
118+
}
100119
topAdded = true;
101120
}
102121

@@ -109,7 +128,16 @@ public String processSql(String sql, Limit limit) {
109128
result.insert( selectOffset, ( hasCommonTables ? "," : "with" )
110129
+ " query_ as (select row_.*,row_number() over (order by current_timestamp) as rownumber_ from (" )
111130
.append( ") row_) select " ).append( aliases )
112-
.append( " from query_ where rownumber_>=? and rownumber_<?" );
131+
.append( " from query_ where rownumber_>=" );
132+
if ( ParameterMarkerStrategyStandard.isStandardRenderer( parameterMarkerStrategy ) ) {
133+
result.append( "? and rownumber_<?" );
134+
}
135+
else {
136+
final int firstPosition = jdbcParameterCount + 1 + ( topAdded ? 1 : 0 );
137+
result.append( parameterMarkerStrategy.createMarker( firstPosition, null ) );
138+
result.append( " and rownumber_<" );
139+
result.append( parameterMarkerStrategy.createMarker( firstPosition + 1, null ) );
140+
}
113141
}
114142

115143
return result.toString();

0 commit comments

Comments
 (0)