From b1da9457aef96d98825bc637695d12bf18b6d9d6 Mon Sep 17 00:00:00 2001 From: wafflejuice Date: Sat, 1 Mar 2025 16:33:26 +0900 Subject: [PATCH 1/3] HHH-19215 handle queries with straight_join QUERY_PATTERN regex handles queries with straight_join --- .../src/main/java/org/hibernate/dialect/Dialect.java | 2 +- .../src/test/java/org/hibernate/dialect/DialectTest.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index ed3114038465..29cab7beed10 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -283,7 +283,7 @@ public abstract class Dialect implements ConversionContext, TypeContributor, Fun private static final Pattern ESCAPE_CLOSING_COMMENT_PATTERN = Pattern.compile( "\\*/" ); private static final Pattern ESCAPE_OPENING_COMMENT_PATTERN = Pattern.compile( "/\\*" ); private static final Pattern QUERY_PATTERN = Pattern.compile( - "^\\s*(select\\b.+?\\bfrom\\b.+?)(\\b(?:natural )?(?:left |right |full )?(?:inner |outer |cross )?join.+?\\b)?(\\bwhere\\b.+?)$"); + "^\\s*(select\\b.+?\\bfrom\\b.+?)(\\b(?:(?:natural )?(?:left |right |full )?(?:inner |outer |cross )?join |straight_join).+?\\b)?(\\bwhere\\b.+?)$"); private static final CoreMessageLogger LOG = Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, Dialect.class.getName() ); diff --git a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java index 45f2432b21bc..1bb956f84728 100644 --- a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java +++ b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java @@ -39,6 +39,14 @@ static Stream _addQueryHints() { builder.add(Arguments.of("Left join query with on : hint", "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'", leftJoinQuery, hints)); + final String straightJoinQueryUsing = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 using(column2) where field = 'value'"; + builder.add(Arguments.of("Straight join query with using : hint", + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'", + straightJoinQueryUsing, hints)); + final String straightJoinQueryOn = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'"; + builder.add(Arguments.of("Straight join query with on : hint", + "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'", + straightJoinQueryOn, hints)); return builder.build(); } From bf26007c07262ac98add21d004e3a8bca3df454d Mon Sep 17 00:00:00 2001 From: wafflejuice Date: Tue, 4 Mar 2025 23:50:58 +0900 Subject: [PATCH 2/3] HHH-19215 make the regex more robust and easier to read --- .../src/main/java/org/hibernate/dialect/Dialect.java | 2 +- .../test/java/org/hibernate/dialect/DialectTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java index 29cab7beed10..4c3d43e49b4d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java @@ -283,7 +283,7 @@ public abstract class Dialect implements ConversionContext, TypeContributor, Fun private static final Pattern ESCAPE_CLOSING_COMMENT_PATTERN = Pattern.compile( "\\*/" ); private static final Pattern ESCAPE_OPENING_COMMENT_PATTERN = Pattern.compile( "/\\*" ); private static final Pattern QUERY_PATTERN = Pattern.compile( - "^\\s*(select\\b.+?\\bfrom\\b.+?)(\\b(?:(?:natural )?(?:left |right |full )?(?:inner |outer |cross )?join |straight_join).+?\\b)?(\\bwhere\\b.+?)$"); + "^\\s*(select\\s+.+?\\s+from\\s+.+?)(\\s+(?:(?:natural)?\\s*(?:left|right|full)?\\s*(?:inner|outer|cross)?\\s*join|straight_join)\\s+.+?)?(\\s+where\\s+.+?)$"); private static final CoreMessageLogger LOG = Logger.getMessageLogger( MethodHandles.lookup(), CoreMessageLogger.class, Dialect.class.getName() ); diff --git a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java index 1bb956f84728..245714ded11f 100644 --- a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java +++ b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java @@ -26,26 +26,26 @@ static Stream _addQueryHints() { final String simpleQuery = "select COUNT(*) from TEST t1_0 where column1 = 'value'"; builder.add( Arguments.of("Simple query : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints)); + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints)); final String joinQueryUsing = "select COUNT(*) from TEST t1_0 join TEST2 t2_0 using(column2) where field = 'value'"; builder.add(Arguments.of("Join query with using : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 using(column2) where field = 'value'", + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 using(column2) where field = 'value'", joinQueryUsing, hints)); final String joinQueryOn = "select COUNT(*) from TEST t1_0 join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'"; builder.add(Arguments.of("Join query with on : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'", + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'", joinQueryOn, hints)); 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'"; builder.add(Arguments.of("Left join query with on : hint", - "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'", + "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'", leftJoinQuery, hints)); final String straightJoinQueryUsing = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 using(column2) where field = 'value'"; builder.add(Arguments.of("Straight join query with using : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'", + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'", straightJoinQueryUsing, hints)); final String straightJoinQueryOn = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'"; builder.add(Arguments.of("Straight join query with on : hint", - "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'", + "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'", straightJoinQueryOn, hints)); return builder.build(); From c4ea726a0c02395e0d53bcbb8fa92ec65d1a3124 Mon Sep 17 00:00:00 2001 From: wafflejuice Date: Tue, 4 Mar 2025 23:53:02 +0900 Subject: [PATCH 3/3] HHH-19215 format indentations --- .../java/org/hibernate/dialect/DialectTest.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java index 245714ded11f..6b8fa31eb6f2 100644 --- a/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java +++ b/hibernate-core/src/test/java/org/hibernate/dialect/DialectTest.java @@ -24,9 +24,8 @@ static Stream _addQueryHints() { final String hints = "MY_INDEX"; final String simpleQuery = "select COUNT(*) from TEST t1_0 where column1 = 'value'"; - builder.add( - Arguments.of("Simple query : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints)); + builder.add(Arguments.of("Simple query : hint", + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) where column1 = 'value'", simpleQuery, hints)); final String joinQueryUsing = "select COUNT(*) from TEST t1_0 join TEST2 t2_0 using(column2) where field = 'value'"; builder.add(Arguments.of("Join query with using : hint", "select COUNT(*) from TEST t1_0 use index (MY_INDEX) join TEST2 t2_0 using(column2) where field = 'value'", @@ -41,12 +40,12 @@ static Stream _addQueryHints() { leftJoinQuery, hints)); final String straightJoinQueryUsing = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 using(column2) where field = 'value'"; builder.add(Arguments.of("Straight join query with using : hint", - "select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'", - straightJoinQueryUsing, hints)); + "select COUNT(*) from TEST t1_0 use index (MY_INDEX) straight_join TEST2 t2_0 using(column2) where field = 'value'", + straightJoinQueryUsing, hints)); final String straightJoinQueryOn = "select COUNT(*) from TEST t1_0 straight_join TEST2 t2_0 on t1_0.column2 = t2_0.column2 where field = 'value'"; builder.add(Arguments.of("Straight join query with on : hint", - "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'", - straightJoinQueryOn, hints)); + "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'", + straightJoinQueryOn, hints)); return builder.build(); }