From 5e20cebb09b3072358bc4ee09e185221c62590e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pachucki?= Date: Wed, 1 Jun 2022 13:14:34 +0200 Subject: [PATCH] Handle newlines when searching for subqueries --- .../data/jpa/repository/query/QueryUtils.java | 3 ++- .../data/jpa/repository/query/QueryUtilsUnitTests.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java index 8d41f865c5..1303c67c2c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java @@ -78,6 +78,7 @@ * @author Jędrzej Biedrzycki * @author Darin Manica * @author Simon Paradies + * @author Michał Pachucki */ public abstract class QueryUtils { @@ -103,7 +104,7 @@ public abstract class QueryUtils { private static final Pattern ALIAS_MATCH; private static final Pattern COUNT_MATCH; private static final Pattern STARTS_WITH_PAREN = Pattern.compile("^\\s*\\("); - private static final Pattern PARENS_TO_REMOVE = Pattern.compile("(\\(.*\\bfrom\\b[^)]+\\))", CASE_INSENSITIVE); + private static final Pattern PARENS_TO_REMOVE = Pattern.compile("(\\(.*\\bfrom\\b[^)]+\\))", CASE_INSENSITIVE | DOTALL); private static final Pattern PROJECTION_CLAUSE = Pattern.compile("select\\s+(?:distinct\\s+)?(.+)\\s+from", Pattern.CASE_INSENSITIVE); diff --git a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java index 5b65b647f0..6f32b4c74e 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java @@ -45,6 +45,7 @@ * @author Greg Turnquist * @author Jędrzej Biedrzycki * @author Darin Manica + * @author Michał Pachucki */ class QueryUtilsUnitTests { @@ -710,6 +711,15 @@ void applySortingAccountsForNativeWindowFunction() { "select * from (select * from user order by 1, 2, 3 desc limit 10) u order by u.active asc, age desc"); } + @Test + void applySortingAccountsForNewlinesInSubselect() { + + Sort sort = Sort.by(Order.desc("age")); + + assertThat(QueryUtils.applySorting("select u\nfrom user u\nwhere exists (select u2\nfrom user u2\n)\n", sort)) + .isEqualTo("select u\nfrom user u\nwhere exists (select u2\nfrom user u2\n)\n order by u.age desc"); + } + @Test // GH-2511 void countQueryUsesCorrectVariable() {