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 @@ -26,7 +26,7 @@
import org.hibernate.dialect.lock.PessimisticReadSelectLockingStrategy;
import org.hibernate.dialect.lock.PessimisticWriteSelectLockingStrategy;
import org.hibernate.dialect.lock.SelectLockingStrategy;
import org.hibernate.dialect.pagination.LegacyHSQLLimitHandler;
import org.hibernate.community.dialect.pagination.LegacyHSQLLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
import org.hibernate.dialect.function.OracleTruncFunction;
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.identity.Oracle12cIdentityColumnSupport;
import org.hibernate.dialect.pagination.LegacyOracleLimitHandler;
import org.hibernate.community.dialect.pagination.LegacyOracleLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.Oracle12LimitHandler;
import org.hibernate.dialect.sequence.OracleSequenceSupport;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import org.hibernate.dialect.identity.IdentityColumnSupport;
import org.hibernate.dialect.identity.SQLServerIdentityColumnSupport;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.dialect.pagination.SQLServer2005LimitHandler;
import org.hibernate.community.dialect.pagination.SQLServer2005LimitHandler;
import org.hibernate.dialect.pagination.SQLServer2012LimitHandler;
import org.hibernate.dialect.pagination.TopLimitHandler;
import org.hibernate.dialect.sequence.NoSequenceSupport;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.dialect.pagination;
package org.hibernate.community.dialect.pagination;

import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;

/**
* A {@link LimitHandler} for HSQL prior to 2.0.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.dialect.pagination;
package org.hibernate.community.dialect.pagination;

import org.hibernate.dialect.DatabaseVersion;
import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;

import java.util.regex.Matcher;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.dialect.pagination;
package org.hibernate.community.dialect.pagination;

import java.sql.PreparedStatement;
import java.sql.SQLException;
Expand All @@ -11,6 +11,8 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.hibernate.dialect.pagination.AbstractLimitHandler;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.query.spi.Limit;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@
*/
package org.hibernate.dialect.pagination;

import org.hibernate.dialect.pagination.SQLServer2005LimitHandler.Keyword;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.regex.Pattern.compile;

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

public static final SQLServer2012LimitHandler INSTANCE = new SQLServer2012LimitHandler();

private enum Keyword {

SELECT ("select(\\s+(distinct|all))?"),
FROM ("from"),
ORDER_BY ("order\\s+by"),
AS ("as"),
WITH ("with");

Pattern pattern;
Keyword(String keyword) {
pattern = compile( "^\\b" + keyword + "\\b", CASE_INSENSITIVE );
}

/**
* Look for a "root" occurrence of this keyword in
* the given SQL fragment, that is, an offset where
* the keyword occurs unquoted and not parenthesized.
*
* @param sql a fragment of SQL
* @return the offset at which the keyword occurs, or
* 0 if it never occurs outside of quotes or
* parentheses.
*/
int rootOffset(String sql) {

//TODO: does not handle comments

//use a regex here for its magical ability
//to match word boundaries and whitespace
Matcher matcher = pattern.matcher( sql ).useTransparentBounds( true );

int depth = 0;
boolean quoted = false;
boolean doubleQuoted = false;
for ( int offset = 0, end = sql.length(); offset < end; ) {
int nextQuote = sql.indexOf('\'', offset);
if ( nextQuote<0 ) {
nextQuote = end;
}
if ( !quoted ) {
for ( int index=offset; index<nextQuote; index++ ) {
switch ( sql.charAt( index ) ) {
case '(' -> depth++;
case ')' -> depth--;
case '"' -> doubleQuoted = !doubleQuoted;
case '[' -> doubleQuoted = true;
case ']' -> doubleQuoted = false;
default -> {
if ( depth == 0 && !doubleQuoted ) {
matcher.region( index, nextQuote );
if ( matcher.find() ) {
//we found the keyword!
return index;
}
}
}

}
}
}
quoted = !quoted;
offset = nextQuote + 1;
}
return 0; //none found
}
}
public SQLServer2012LimitHandler() {
super(true);
}
Expand Down