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 <berenguerbl...@gmail.com> 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: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org