Skip to content

Commit 2269a00

Browse files
hogeunchungbeikov
authored andcommitted
HHH-19215 handle queries with straight_join or just order by
1 parent 72dae39 commit 2269a00

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ public abstract class Dialect implements ConversionContext, TypeContributor, Fun
338338
private static final Pattern ESCAPE_CLOSING_COMMENT_PATTERN = Pattern.compile( "\\*/" );
339339
private static final Pattern ESCAPE_OPENING_COMMENT_PATTERN = Pattern.compile( "/\\*" );
340340
private static final Pattern QUERY_PATTERN = Pattern.compile(
341-
"^\\s*(select\\b.+?\\bfrom\\b.+?)(\\b(?:natural )?(?:left |right |full )?(?:inner |outer |cross )?join.+?\\b)?(\\bwhere\\b.+?)$",
341+
"^\\s*(select\\s.+?\\sfrom\\s.+?)(\\s(?:(?:natural)?\\s*(?:left|right|full)?\\s*(?:inner|outer|cross)?\\s*join|straight_join)\\s.+?)?(\\swhere\\s.+?)?(\\sorder\\s+by\\s.+?)?$",
342342
Pattern.CASE_INSENSITIVE);
343343

344344
//needed for converting precision from decimal to binary digits
@@ -5242,14 +5242,8 @@ public String addSqlHintOrComment(String sql, QueryOptions queryOptions, boolean
52425242
public static String addUseIndexQueryHint(String query, String hints) {
52435243
final Matcher matcher = QUERY_PATTERN.matcher( query );
52445244
if ( matcher.matches() && matcher.groupCount() > 1 ) {
5245-
final String startToken = matcher.group(1);
5246-
// Null if there is no join in the query
5247-
final String joinToken = matcher.group(2);
5248-
final String endToken = matcher.group(3);
5249-
return startToken
5250-
+ " use index (" + hints + ") "
5251-
+ ( joinToken == null ? "" : joinToken )
5252-
+ endToken;
5245+
final String startToken = matcher.group( 1 );
5246+
return startToken + " use index (" + hints + ")" + query.substring( startToken.length() );
52535247
}
52545248
else {
52555249
return query;

hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,32 @@ static Stream<Arguments> _addQueryHints() {
2424

2525
final String hints = "MY_INDEX";
2626
final String simpleQuery = "select COUNT(*) from TEST t1_0 where column1 = 'value'";
27-
builder.add(
28-
Arguments.of("Simple query : hint",
29-
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints));
27+
builder.add(Arguments.of("Simple query : hint",
28+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints));
29+
final String limitQuery = "select COUNT(*) from TEST t1_0 order by column1 limit 1";
30+
builder.add(Arguments.of("Limit query : hint",
31+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) order by column1 limit 1",
32+
limitQuery, hints));
3033
final String joinQueryUsing = "select COUNT(*) from TEST t1_0 join TEST2 t2_0 using(column2) where field = 'value'";
3134
builder.add(Arguments.of("Join query with using : hint",
32-
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 using(column2) where field = 'value'",
35+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 using(column2) where field = 'value'",
3336
joinQueryUsing, hints));
3437
final String joinQueryOn = "select COUNT(*) from TEST t1_0 join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'";
3538
builder.add(Arguments.of("Join query with on : hint",
36-
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'",
39+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'",
3740
joinQueryOn, hints));
3841
final String leftJoinQuery = "select COUNT(*) from TEST t1_0 left join TEST2 t2_0 on t1_0.column2 = t2_0.column2 and t1_0.column3 = t2_0.column3 where field = 'value'";
3942
builder.add(Arguments.of("Left join query with on : hint",
40-
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) left join TEST2 t2_0 on t1_0.column2 = t2_0.column2 and t1_0.column3 = t2_0.column3 where field = 'value'",
43+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) left join TEST2 t2_0 on t1_0.column2 = t2_0.column2 and t1_0.column3 = t2_0.column3 where field = 'value'",
4144
leftJoinQuery, hints));
45+
final String straightJoinQueryUsing = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 using(column2) where field = 'value'";
46+
builder.add(Arguments.of("Straight join query with using : hint",
47+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'",
48+
straightJoinQueryUsing, hints));
49+
final String straightJoinQueryOn = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'";
50+
builder.add(Arguments.of("Straight join query with on : hint",
51+
"select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'",
52+
straightJoinQueryOn, hints));
4253

4354
return builder.build();
4455
}

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryCommentTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public void testSelectNamedNativeQueryWithQueryHintUsingIndex(EntityManagerFacto
219219
statementInspector.assertExecutedCount(1);
220220

221221
statementInspector.assertExecuted(
222-
"/* COMMENT_SELECT_INDEX_game_title */ select g1_0.id,g1_0.title from game g1_0 use index (idx_game_id) where g1_0.title=?"
222+
"/* COMMENT_SELECT_INDEX_game_title */ select g1_0.id,g1_0.title from game g1_0 use index (idx_game_id) where g1_0.title=?"
223223
);
224224
}
225225
);

0 commit comments

Comments
 (0)