From 1bd8eca5943119693af416e2559b62c268cd7c97 Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Sat, 20 Jul 2024 00:09:51 +0200 Subject: [PATCH 1/6] [CALCITE-6145] Function 'TRIM' without parameters throw NullPointerException --- .../main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java | 3 +++ .../src/main/java/org/apache/calcite/test/SqlOperatorTest.java | 1 + 2 files changed, 4 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index 7373bbc9002..37f8316677d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -130,6 +130,9 @@ public SqlTrimFunction(String name, SqlKind kind, if (operands[1] == null) { operands[1] = SqlLiteral.createCharString(" ", pos); } + if (operands[2] == null) { + throw new IllegalArgumentException("String to trim cannot be null"); + } break; default: throw new IllegalArgumentException( diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 8b94908fbd6..55b605f164d 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -10857,6 +10857,7 @@ void assertSubFunReturns(boolean binary, String s, int start, f.checkFails("trim('' from 'abcde')", "Trim error: trim character must be exactly 1 character", true); + f.checkFails("trim()", "String to trim cannot be null", false); final SqlOperatorFixture f1 = f.withConformance(SqlConformanceEnum.MYSQL_5); f1.checkString("trim(leading 'eh' from 'hehe__hehe')", "__hehe", From 295c069751c114079f5d7d04a4087cbec7605514 Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Mon, 22 Jul 2024 22:18:29 +0200 Subject: [PATCH 2/6] Add test for trim(null) --- .../src/main/java/org/apache/calcite/test/SqlOperatorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 55b605f164d..4ce8bdb16ef 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -10843,6 +10843,7 @@ void assertSubFunReturns(boolean binary, String s, int start, f.checkString("trim(trailing 'a' from 'aAa')", "aA", "VARCHAR(3) NOT NULL"); f.checkNull("trim(cast(null as varchar(1)) from 'a')"); f.checkNull("trim('a' from cast(null as varchar(1)))"); + f.checkNull("trim(null)"); // SQL:2003 6.29.9: trim string must have length=1. Failure occurs // at runtime. From ccd20a0384f207f1c2149fffbdf88a8d8ea2bc2f Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Mon, 22 Jul 2024 22:21:22 +0200 Subject: [PATCH 3/6] Improve error message when trim has no args --- .../main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java | 2 +- .../src/main/java/org/apache/calcite/test/SqlOperatorTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index 37f8316677d..002c27eb18c 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -131,7 +131,7 @@ public SqlTrimFunction(String name, SqlKind kind, operands[1] = SqlLiteral.createCharString(" ", pos); } if (operands[2] == null) { - throw new IllegalArgumentException("String to trim cannot be null"); + throw new IllegalArgumentException("trim cannot be called without arguments"); } break; default: diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 4ce8bdb16ef..089f5694add 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -10858,7 +10858,7 @@ void assertSubFunReturns(boolean binary, String s, int start, f.checkFails("trim('' from 'abcde')", "Trim error: trim character must be exactly 1 character", true); - f.checkFails("trim()", "String to trim cannot be null", false); + f.checkFails("trim()", "trim cannot be called without arguments", false); final SqlOperatorFixture f1 = f.withConformance(SqlConformanceEnum.MYSQL_5); f1.checkString("trim(leading 'eh' from 'hehe__hehe')", "__hehe", From a3cb26577ebf25016152aa7455030a77b35bd509 Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Wed, 7 Aug 2024 12:53:54 +0200 Subject: [PATCH 4/6] Align error message --- .../java/org/apache/calcite/sql/fun/SqlTrimFunction.java | 5 ++++- .../main/java/org/apache/calcite/test/SqlOperatorTest.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index 002c27eb18c..e1bea84095d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -131,7 +131,10 @@ public SqlTrimFunction(String name, SqlKind kind, operands[1] = SqlLiteral.createCharString(" ", pos); } if (operands[2] == null) { - throw new IllegalArgumentException("trim cannot be called without arguments"); + // This variant occurs, when someone writes TRIM() without any arguments as the first two + // absent arguments are set to default values and the third argument (string to trim) + // was absent, too + throw new IllegalArgumentException("Invalid number of arguments to function 'TRIM'. Was expecting at least 2 arguments"); } break; default: diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 089f5694add..6a722a317d7 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -10858,7 +10858,7 @@ void assertSubFunReturns(boolean binary, String s, int start, f.checkFails("trim('' from 'abcde')", "Trim error: trim character must be exactly 1 character", true); - f.checkFails("trim()", "trim cannot be called without arguments", false); + f.checkFails("trim()", "Invalid number of arguments to function 'TRIM'. Was expecting at least 2 arguments", false); final SqlOperatorFixture f1 = f.withConformance(SqlConformanceEnum.MYSQL_5); f1.checkString("trim(leading 'eh' from 'hehe__hehe')", "__hehe", From befabe0fbdae7d2ecbe7768bab26185398887930 Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Wed, 7 Aug 2024 12:55:19 +0200 Subject: [PATCH 5/6] Improve explanatory comment --- .../main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index e1bea84095d..d3c04f2572e 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -133,7 +133,7 @@ public SqlTrimFunction(String name, SqlKind kind, if (operands[2] == null) { // This variant occurs, when someone writes TRIM() without any arguments as the first two // absent arguments are set to default values and the third argument (string to trim) - // was absent, too + // stays null throw new IllegalArgumentException("Invalid number of arguments to function 'TRIM'. Was expecting at least 2 arguments"); } break; From 344d70c35f86028347f9b54eed7504f006822aa9 Mon Sep 17 00:00:00 2001 From: Tim Grein Date: Wed, 7 Aug 2024 13:32:24 +0200 Subject: [PATCH 6/6] Fix line length error --- .../main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java index d3c04f2572e..4c6e441bd9d 100644 --- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java +++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java @@ -134,7 +134,8 @@ public SqlTrimFunction(String name, SqlKind kind, // This variant occurs, when someone writes TRIM() without any arguments as the first two // absent arguments are set to default values and the third argument (string to trim) // stays null - throw new IllegalArgumentException("Invalid number of arguments to function 'TRIM'. Was expecting at least 2 arguments"); + throw new IllegalArgumentException( + "Invalid number of arguments to function 'TRIM'. Was expecting at least 2 arguments"); } break; default: