From a24e6b60648113fddfd03781c32002d901194c97 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Sat, 2 Feb 2019 00:40:56 +1300 Subject: [PATCH] #1623 - DbOrderByTrim doesn't remove asc/desc if you're sorting by a function called on a column This fix removes the word boundary check prior to the blank space for asc and desc (allowing the preceeding char to be a brace or anything) --- .../server/query/DbOrderByTrim.java | 2 +- .../server/query/DbOrderByTrimTest.java | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/test/java/io/ebeaninternal/server/query/DbOrderByTrimTest.java diff --git a/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java b/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java index 5865da349..766be909b 100644 --- a/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java +++ b/src/main/java/io/ebeaninternal/server/query/DbOrderByTrim.java @@ -4,7 +4,7 @@ import java.util.regex.Pattern; class DbOrderByTrim { - private static final Pattern orderByTrim = Pattern.compile("(?i)\\b asc\\b|\\b desc\\b|\\b nulls first\\b|\\b nulls last\\b"); + private static final Pattern orderByTrim = Pattern.compile("(?i) asc\\b| desc\\b|\\b nulls first\\b|\\b nulls last\\b"); /** * Convert the dbOrderBy clause to be safe for adding to select or distinct on. diff --git a/src/test/java/io/ebeaninternal/server/query/DbOrderByTrimTest.java b/src/test/java/io/ebeaninternal/server/query/DbOrderByTrimTest.java new file mode 100644 index 000000000..d515f6a71 --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/query/DbOrderByTrimTest.java @@ -0,0 +1,66 @@ +package io.ebeaninternal.server.query; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class DbOrderByTrimTest { + + @Test + public void trim() { + + String[] tests = {"foo", "bar", "a b c", "some_", "some()", "some'g'", "some('sd')", "some(a.b, '')"}; + for (String value : tests) { + test(value, " desc"); + } + for (String value : tests) { + test(value, " asc"); + } + } + + private void test(String value, String suffix) { + assertEquals(value, DbOrderByTrim.trim(value + suffix)); + } + + @Test + public void test_when_pgp_sym_decrypt() { + assertEquals("pgp_sym_decrypt(t0.columnName, '')", DbOrderByTrim.trim("pgp_sym_decrypt(t0.columnName, '') desc")); + } + + @Test + public void trim_doubleSpace() { + assertEquals("foo bar", DbOrderByTrim.trim("foo desc bar")); + } + + @Test + public void trim_description() { + assertEquals("foo description", DbOrderByTrim.trim("foo description")); + assertEquals("foo ription", DbOrderByTrim.trim("foo desc ription")); + } + + @Test + public void trim_asc1() { + assertEquals("foo asc1", DbOrderByTrim.trim("foo asc1")); + assertEquals("foo 1", DbOrderByTrim.trim("foo asc 1")); + } + + @Test + public void trim_various() { + assertEquals("foo bar", DbOrderByTrim.trim("foo asc desc bar")); + assertEquals("foo bar", DbOrderByTrim.trim("foo desc asc desc asc asc bar")); + + assertEquals("foo", DbOrderByTrim.trim("foo DESC")); + assertEquals("foo ", DbOrderByTrim.trim("foo DESC ")); + assertEquals("foo", DbOrderByTrim.trim("foo ASC")); + assertEquals("foo ", DbOrderByTrim.trim("foo ASC ")); + } + + @Test + public void trim_nulls() { + assertEquals("foo", DbOrderByTrim.trim("foo nulls first asc")); + assertEquals("foo", DbOrderByTrim.trim("foo nulls last desc")); + assertEquals("foo", DbOrderByTrim.trim("foo asc nulls first")); + assertEquals("foo", DbOrderByTrim.trim("foo desc nulls last")); + } + +}