This is an automated email from the ASF dual-hosted git repository.
bereng pushed a commit to branch cassandra-4.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/cassandra-4.0 by this push:
new 8b0b22e Cassandra fails to process OperationExecutionException which
causes ClassCastException
8b0b22e is described below
commit 8b0b22e166e2845a7c61af21cf13d8e0ff19efd6
Author: Bereng <[email protected]>
AuthorDate: Mon Sep 6 09:27:32 2021 +0200
Cassandra fails to process OperationExecutionException which causes
ClassCastException
patch by Benjamin Lerer, Berenguer Blasi; reviewed by Benjamin Lerer,
Berenguer Blasi for CASSANDRA-15269
---
.../org/apache/cassandra/cql3/functions/FromJsonFct.java | 2 +-
.../cassandra/exceptions/FunctionExecutionException.java | 12 +++++++++---
.../exceptions/OperationExecutionException.java | 16 ++++++++--------
.../cassandra/transport/messages/ErrorMessage.java | 2 +-
.../cassandra/cql3/functions/OperationFctsTest.java | 15 +++++++++++++++
5 files changed, 34 insertions(+), 13 deletions(-)
diff --git a/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
b/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
index 8f07b38..01a6e20 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FromJsonFct.java
@@ -69,7 +69,7 @@ public class FromJsonFct extends NativeScalarFunction
}
catch (IOException exc)
{
- throw new FunctionExecutionException(NAME,
Collections.singletonList("text"), String.format("Could not decode JSON string
'%s': %s", jsonArg, exc.toString()));
+ throw FunctionExecutionException.create(NAME,
Collections.singletonList("text"), String.format("Could not decode JSON string
'%s': %s", jsonArg, exc.toString()));
}
catch (MarshalException exc)
{
diff --git
a/src/java/org/apache/cassandra/exceptions/FunctionExecutionException.java
b/src/java/org/apache/cassandra/exceptions/FunctionExecutionException.java
index e743fde..a9a99f6 100644
--- a/src/java/org/apache/cassandra/exceptions/FunctionExecutionException.java
+++ b/src/java/org/apache/cassandra/exceptions/FunctionExecutionException.java
@@ -37,11 +37,17 @@ public class FunctionExecutionException extends
RequestExecutionException
return fee;
}
- public FunctionExecutionException(FunctionName functionName, List<String>
argTypes, String detail)
+ public static FunctionExecutionException create(FunctionName functionName,
List<String> argTypes, String detail)
{
- super(ExceptionCode.FUNCTION_FAILURE, "execution of '" + functionName
+ argTypes + "' failed: " + detail);
+ String msg = "execution of '" + functionName + argTypes + "' failed: "
+ detail;
+ return new FunctionExecutionException(functionName, argTypes, msg);
+ }
+
+ public FunctionExecutionException(FunctionName functionName, List<String>
argTypes, String msg)
+ {
+ super(ExceptionCode.FUNCTION_FAILURE, msg);
this.functionName = functionName;
this.argTypes = argTypes;
- this.detail = detail;
+ this.detail = msg;
}
}
diff --git
a/src/java/org/apache/cassandra/exceptions/OperationExecutionException.java
b/src/java/org/apache/cassandra/exceptions/OperationExecutionException.java
index 4f9ffa4..f86969e 100644
--- a/src/java/org/apache/cassandra/exceptions/OperationExecutionException.java
+++ b/src/java/org/apache/cassandra/exceptions/OperationExecutionException.java
@@ -19,12 +19,13 @@ package org.apache.cassandra.exceptions;
import java.util.List;
+import org.apache.cassandra.cql3.functions.OperationFcts;
import org.apache.cassandra.db.marshal.AbstractType;
/**
* Thrown when an operation problem has occured (e.g. division by zero with
integer).
*/
-public final class OperationExecutionException extends
RequestExecutionException
+public final class OperationExecutionException extends
FunctionExecutionException
{
/**
@@ -38,20 +39,19 @@ public final class OperationExecutionException extends
RequestExecutionException
public static OperationExecutionException create(char operator,
List<AbstractType<?>> argTypes, Exception e)
{
List<String> cqlTypes = AbstractType.asCQLTypeStringList(argTypes);
- return new OperationExecutionException(String.format("the operation
'%s %s %s' failed: %s",
- cqlTypes.get(0),
- operator,
- cqlTypes.get(1),
- e.getMessage()));
+ String msg = String.format("the operation '%s %s %s' failed: %s",
cqlTypes.get(0), operator, cqlTypes.get(1), e.getMessage());
+ return new OperationExecutionException(operator, cqlTypes, msg);
}
/**
* Creates an <code>OperationExecutionException</code> with the specified
message.
+ * @param operator the operator
+ * @param argTypes the argument types
* @param msg the error message
*/
- public OperationExecutionException(String msg)
+ public OperationExecutionException(char operator, List<String> argTypes,
String msg)
{
- super(ExceptionCode.FUNCTION_FAILURE, msg);
+ super(OperationFcts.getFunctionNameFromOperator(operator), argTypes,
msg);
}
}
diff --git a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
index 14b4ac4..6890584 100644
--- a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
@@ -149,7 +149,7 @@ public class ErrorMessage extends Message.Response
String fKeyspace = CBUtil.readString(body);
String fName = CBUtil.readString(body);
List<String> argTypes = CBUtil.readStringList(body);
- te = new FunctionExecutionException(new
FunctionName(fKeyspace, fName), argTypes, msg);
+ te = FunctionExecutionException.create(new
FunctionName(fKeyspace, fName), argTypes, msg);
break;
case UNPREPARED:
{
diff --git
a/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
b/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
index c8ee935..053283d 100644
--- a/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.cql3.functions;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
+import java.util.Optional;
import org.junit.Test;
@@ -28,6 +29,7 @@ import org.apache.cassandra.cql3.UntypedResultSet;
import org.apache.cassandra.exceptions.OperationExecutionException;
import org.apache.cassandra.serializers.SimpleDateSerializer;
import org.apache.cassandra.serializers.TimestampSerializer;
+import org.apache.cassandra.transport.ProtocolVersion;
public class OperationFctsTest extends CQLTester
{
@@ -861,4 +863,17 @@ public class OperationFctsTest extends CQLTester
{
return SimpleDateSerializer.dateStringToDays(dateAsString);
}
+
+ @Test
+ public void testFunctionException() throws Throwable
+ {
+ createTable("CREATE TABLE %s (pk int, c1 int, c2 int, v text, PRIMARY
KEY(pk, c1, c2))");
+ execute("INSERT INTO %s (pk, c1, c2, v) VALUES (1, 0, 2, 'test')");
+
+ assertInvalidThrowMessage(Optional.of(ProtocolVersion.CURRENT),
+ "the operation 'int / int' failed: / by
zero",
+
com.datastax.driver.core.exceptions.FunctionExecutionException.class,
+ "SELECT c2 / c1 FROM %s WHERE pk = 1");
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]