This is an automated email from the ASF dual-hosted git repository.

gian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 07c28f17ca6 Fix missing format strings in calls to 
DruidException.build  (#15056)
07c28f17ca6 is described below

commit 07c28f17ca6020c1cc0fa954d19b9b0cc8d32c1b
Author: Pranav <[email protected]>
AuthorDate: Fri Sep 29 17:00:36 2023 -0700

    Fix missing format strings in calls to DruidException.build  (#15056)
    
    * Fix the NPE bug in nonStrictFormat
    
    * using non null format string
    
    * using Assert.assertThrows
---
 .../msq/sql/resources/SqlStatementResource.java    |  2 +-
 .../druid/msq/sql/resources/SqlTaskResource.java   |  2 +-
 .../druid/msq/util/SqlStatementResourceHelper.java |  2 +-
 .../java/org/apache/druid/error/ErrorResponse.java |  2 +-
 .../apache/druid/error/QueryExceptionCompat.java   |  2 +-
 .../org/apache/druid/error/ErrorResponseTest.java  | 28 ++++++++++++++++++++++
 .../druid/java/util/common/StringUtilsTest.java    | 15 ++++++++++++
 .../druid/sql/calcite/planner/DruidPlanner.java    |  6 ++---
 8 files changed, 51 insertions(+), 8 deletions(-)

diff --git 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java
 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java
index 97be6dbc3bb..dd4e0840300 100644
--- 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java
+++ 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlStatementResource.java
@@ -217,7 +217,7 @@ public class SqlStatementResource
       return buildNonOkResponse(
           DruidException.forPersona(DruidException.Persona.DEVELOPER)
                         .ofCategory(DruidException.Category.UNCATEGORIZED)
-                        .build(e.getMessage())
+                        .build("%s", e.getMessage())
       );
     }
     finally {
diff --git 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlTaskResource.java
 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlTaskResource.java
index 187601cea0e..e9b4c61cef2 100644
--- 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlTaskResource.java
+++ 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/sql/resources/SqlTaskResource.java
@@ -170,7 +170,7 @@ public class SqlTaskResource
           sqlQueryId,
           DruidException.forPersona(DruidException.Persona.DEVELOPER)
                         .ofCategory(DruidException.Category.UNCATEGORIZED)
-                        .build(e.getMessage())
+                        .build("%s", e.getMessage())
       );
     }
     finally {
diff --git 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/util/SqlStatementResourceHelper.java
 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/util/SqlStatementResourceHelper.java
index 08bc3dc54d9..86aed98f063 100644
--- 
a/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/util/SqlStatementResourceHelper.java
+++ 
b/extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/util/SqlStatementResourceHelper.java
@@ -234,7 +234,7 @@ public class SqlStatementResourceHelper
           null,
           DruidException.forPersona(DruidException.Persona.DEVELOPER)
                         .ofCategory(DruidException.Category.UNCATEGORIZED)
-                        
.build(taskResponse.getStatus().getErrorMsg()).toErrorResponse()
+                        .build("%s", 
taskResponse.getStatus().getErrorMsg()).toErrorResponse()
       ));
     }
 
diff --git a/processing/src/main/java/org/apache/druid/error/ErrorResponse.java 
b/processing/src/main/java/org/apache/druid/error/ErrorResponse.java
index 7b571cca271..0c6edf25c10 100644
--- a/processing/src/main/java/org/apache/druid/error/ErrorResponse.java
+++ b/processing/src/main/java/org/apache/druid/error/ErrorResponse.java
@@ -204,7 +204,7 @@ public class ErrorResponse
             {
               return bob.forPersona(cause.getTargetPersona())
                         .ofCategory(cause.getCategory())
-                        .build(cause, cause.getMessage())
+                        .build(cause, "%s", cause.getMessage())
                         .withContext(cause.getContext());
             }
           }
diff --git 
a/processing/src/main/java/org/apache/druid/error/QueryExceptionCompat.java 
b/processing/src/main/java/org/apache/druid/error/QueryExceptionCompat.java
index 163c7b04cd0..5782ca55ee0 100644
--- a/processing/src/main/java/org/apache/druid/error/QueryExceptionCompat.java
+++ b/processing/src/main/java/org/apache/druid/error/QueryExceptionCompat.java
@@ -47,7 +47,7 @@ public class QueryExceptionCompat extends 
DruidException.Failure
   {
     return bob.forPersona(DruidException.Persona.OPERATOR)
               .ofCategory(convertFailType(exception.getFailType()))
-              .build(exception, exception.getMessage())
+              .build(exception, "%s", exception.getMessage())
               .withContext("host", exception.getHost())
               .withContext("errorClass", exception.getErrorClass())
               .withContext("legacyErrorCode", exception.getErrorCode());
diff --git 
a/processing/src/test/java/org/apache/druid/error/ErrorResponseTest.java 
b/processing/src/test/java/org/apache/druid/error/ErrorResponseTest.java
index 2ddd39aa7da..16a1ccecec0 100644
--- a/processing/src/test/java/org/apache/druid/error/ErrorResponseTest.java
+++ b/processing/src/test/java/org/apache/druid/error/ErrorResponseTest.java
@@ -107,4 +107,32 @@ public class ErrorResponseTest
             .expectMessageIs("Query did not complete within configured timeout 
period. You can increase query timeout or tune the performance of query.")
     );
   }
+  @Test
+  public void testQueryExceptionCompatWithNullMessage()
+  {
+    ErrorResponse response = new ErrorResponse(DruidException.fromFailure(new 
QueryExceptionCompat(new QueryTimeoutException(
+        null,
+        "hostname"
+    ))));
+    final Map<String, Object> asMap = response.getAsMap();
+    MatcherAssert.assertThat(
+        asMap,
+        DruidMatchers.mapMatcher(
+            "error",
+            "Query timeout",
+
+            "errorCode",
+            "legacyQueryException",
+
+            "persona",
+            "OPERATOR",
+
+            "category",
+            "TIMEOUT",
+
+            "errorMessage",
+            "null"
+        )
+    );
+  }
 }
diff --git 
a/processing/src/test/java/org/apache/druid/java/util/common/StringUtilsTest.java
 
b/processing/src/test/java/org/apache/druid/java/util/common/StringUtilsTest.java
index 3f2d5713c2f..5927207ba08 100644
--- 
a/processing/src/test/java/org/apache/druid/java/util/common/StringUtilsTest.java
+++ 
b/processing/src/test/java/org/apache/druid/java/util/common/StringUtilsTest.java
@@ -386,4 +386,19 @@ public class StringUtilsTest
       }
     }
   }
+
+  @Test()
+  public void testNonStrictFormatWithNullMessage()
+  {
+    Assert.assertThrows(NullPointerException.class, () -> 
StringUtils.nonStrictFormat(null, 1, 2));
+  }
+
+  @Test
+  public void testNonStrictFormatWithStringContainingPercent()
+  {
+    Assert.assertEquals(
+        "some string containing % %s %d %f",
+        StringUtils.nonStrictFormat("%s", "some string containing % %s %d %f")
+    );
+  }
 }
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidPlanner.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidPlanner.java
index b77a5fdd498..e47411361b2 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidPlanner.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/planner/DruidPlanner.java
@@ -345,7 +345,7 @@ public class DruidPlanner implements Closeable
           return DruidException.forPersona(DruidException.Persona.USER)
                                
.ofCategory(DruidException.Category.INVALID_INPUT)
                                .withErrorCode("invalidInput")
-                               .build(inner, 
inner.getMessage()).withContext("sourceType", "sql");
+                               .build(inner, "%s", 
inner.getMessage()).withContext("sourceType", "sql");
         } else {
           final String theUnexpectedToken = 
getUnexpectedTokenString(parseException);
 
@@ -390,14 +390,14 @@ public class DruidPlanner implements Closeable
     catch (RelOptPlanner.CannotPlanException inner) {
       return DruidException.forPersona(DruidException.Persona.USER)
                            .ofCategory(DruidException.Category.INVALID_INPUT)
-                           .build(inner, inner.getMessage());
+                           .build(inner, "%s", inner.getMessage());
     }
     catch (Exception inner) {
       // Anything else. Should not get here. Anything else should already have
       // been translated to a DruidException unless it is an unexpected 
exception.
       return DruidException.forPersona(DruidException.Persona.ADMIN)
                            .ofCategory(DruidException.Category.UNCATEGORIZED)
-                           .build(inner, inner.getMessage());
+                           .build(inner, "%s", inner.getMessage());
     }
   }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to