Skip to content

Commit dd54cbf

Browse files
MoadElfatihigavinking
authored andcommitted
HHH-19352 move some legacy LimitHandlers to community dialects module
1 parent 0562982 commit dd54cbf

File tree

7 files changed

+85
-7
lines changed

7 files changed

+85
-7
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.hibernate.dialect.lock.PessimisticReadSelectLockingStrategy;
2727
import org.hibernate.dialect.lock.PessimisticWriteSelectLockingStrategy;
2828
import org.hibernate.dialect.lock.SelectLockingStrategy;
29-
import org.hibernate.dialect.pagination.LegacyHSQLLimitHandler;
29+
import org.hibernate.community.dialect.pagination.LegacyHSQLLimitHandler;
3030
import org.hibernate.dialect.pagination.LimitHandler;
3131
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
3232
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import org.hibernate.dialect.function.OracleTruncFunction;
4444
import org.hibernate.dialect.identity.IdentityColumnSupport;
4545
import org.hibernate.dialect.identity.Oracle12cIdentityColumnSupport;
46-
import org.hibernate.dialect.pagination.LegacyOracleLimitHandler;
46+
import org.hibernate.community.dialect.pagination.LegacyOracleLimitHandler;
4747
import org.hibernate.dialect.pagination.LimitHandler;
4848
import org.hibernate.dialect.pagination.Oracle12LimitHandler;
4949
import org.hibernate.dialect.sequence.OracleSequenceSupport;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.hibernate.dialect.identity.IdentityColumnSupport;
2929
import org.hibernate.dialect.identity.SQLServerIdentityColumnSupport;
3030
import org.hibernate.dialect.pagination.LimitHandler;
31-
import org.hibernate.dialect.pagination.SQLServer2005LimitHandler;
31+
import org.hibernate.community.dialect.pagination.SQLServer2005LimitHandler;
3232
import org.hibernate.dialect.pagination.SQLServer2012LimitHandler;
3333
import org.hibernate.dialect.pagination.TopLimitHandler;
3434
import org.hibernate.dialect.sequence.NoSequenceSupport;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
* SPDX-License-Identifier: Apache-2.0
33
* Copyright Red Hat Inc. and Hibernate Authors
44
*/
5-
package org.hibernate.dialect.pagination;
5+
package org.hibernate.community.dialect.pagination;
6+
7+
import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
8+
import org.hibernate.dialect.pagination.LimitHandler;
69

710
/**
811
* A {@link LimitHandler} for HSQL prior to 2.0.

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
* SPDX-License-Identifier: Apache-2.0
33
* Copyright Red Hat Inc. and Hibernate Authors
44
*/
5-
package org.hibernate.dialect.pagination;
5+
package org.hibernate.community.dialect.pagination;
66

77
import org.hibernate.dialect.DatabaseVersion;
8+
import org.hibernate.dialect.pagination.AbstractLimitHandler;
9+
import org.hibernate.dialect.pagination.LimitHandler;
810
import org.hibernate.query.spi.Limit;
911

1012
import java.util.regex.Matcher;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* SPDX-License-Identifier: Apache-2.0
33
* Copyright Red Hat Inc. and Hibernate Authors
44
*/
5-
package org.hibernate.dialect.pagination;
5+
package org.hibernate.community.dialect.pagination;
66

77
import java.sql.PreparedStatement;
88
import java.sql.SQLException;
@@ -11,6 +11,8 @@
1111
import java.util.regex.Matcher;
1212
import java.util.regex.Pattern;
1313

14+
import org.hibernate.dialect.pagination.AbstractLimitHandler;
15+
import org.hibernate.dialect.pagination.LimitHandler;
1416
import org.hibernate.internal.util.StringHelper;
1517
import org.hibernate.query.spi.Limit;
1618

hibernate-core/src/main/java/org/hibernate/dialect/pagination/SQLServer2012LimitHandler.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
*/
55
package org.hibernate.dialect.pagination;
66

7-
import org.hibernate.dialect.pagination.SQLServer2005LimitHandler.Keyword;
7+
8+
import java.util.regex.Matcher;
9+
import java.util.regex.Pattern;
10+
11+
import static java.util.regex.Pattern.CASE_INSENSITIVE;
12+
import static java.util.regex.Pattern.compile;
813

914
/**
1015
* A {@link LimitHandler} compatible with SQL Server 2012 which
@@ -27,6 +32,72 @@ public class SQLServer2012LimitHandler extends OffsetFetchLimitHandler {
2732

2833
public static final SQLServer2012LimitHandler INSTANCE = new SQLServer2012LimitHandler();
2934

35+
private enum Keyword {
36+
37+
SELECT ("select(\\s+(distinct|all))?"),
38+
FROM ("from"),
39+
ORDER_BY ("order\\s+by"),
40+
AS ("as"),
41+
WITH ("with");
42+
43+
Pattern pattern;
44+
Keyword(String keyword) {
45+
pattern = compile( "^\\b" + keyword + "\\b", CASE_INSENSITIVE );
46+
}
47+
48+
/**
49+
* Look for a "root" occurrence of this keyword in
50+
* the given SQL fragment, that is, an offset where
51+
* the keyword occurs unquoted and not parenthesized.
52+
*
53+
* @param sql a fragment of SQL
54+
* @return the offset at which the keyword occurs, or
55+
* 0 if it never occurs outside of quotes or
56+
* parentheses.
57+
*/
58+
int rootOffset(String sql) {
59+
60+
//TODO: does not handle comments
61+
62+
//use a regex here for its magical ability
63+
//to match word boundaries and whitespace
64+
Matcher matcher = pattern.matcher( sql ).useTransparentBounds( true );
65+
66+
int depth = 0;
67+
boolean quoted = false;
68+
boolean doubleQuoted = false;
69+
for ( int offset = 0, end = sql.length(); offset < end; ) {
70+
int nextQuote = sql.indexOf('\'', offset);
71+
if ( nextQuote<0 ) {
72+
nextQuote = end;
73+
}
74+
if ( !quoted ) {
75+
for ( int index=offset; index<nextQuote; index++ ) {
76+
switch ( sql.charAt( index ) ) {
77+
case '(' -> depth++;
78+
case ')' -> depth--;
79+
case '"' -> doubleQuoted = !doubleQuoted;
80+
case '[' -> doubleQuoted = true;
81+
case ']' -> doubleQuoted = false;
82+
default -> {
83+
if ( depth == 0 && !doubleQuoted ) {
84+
matcher.region( index, nextQuote );
85+
if ( matcher.find() ) {
86+
//we found the keyword!
87+
return index;
88+
}
89+
}
90+
}
91+
92+
}
93+
}
94+
}
95+
quoted = !quoted;
96+
offset = nextQuote + 1;
97+
}
98+
return 0; //none found
99+
}
100+
}
30101
public SQLServer2012LimitHandler() {
31102
super(true);
32103
}

0 commit comments

Comments
 (0)