diff --git a/CHANGELOG.md b/CHANGELOG.md index bdedc677864430fc61ca4c06e86574c6e0765fcc..04f6d43ad5e61befeae5c1441eec7f61126bde94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### +* `NullPointerException` in GRPC API converters when executing SELECT query on + NULL values. + ### Security ### ### Documentation ### diff --git a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java index b4605c824eab5eb1b3b24990ebf503e8686a284b..1b70a729e4950f8aaf838100397b0338e7d798c0 100644 --- a/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java +++ b/src/main/java/org/caosdb/server/grpc/CaosDBToGrpcConverters.java @@ -706,7 +706,7 @@ public class CaosDBToGrpcConverters { return null; } - private org.caosdb.api.entity.v1.Value.Builder getSelectedValue(Selection s, EntityInterface e) { + org.caosdb.api.entity.v1.Value.Builder getSelectedValue(Selection s, EntityInterface e) { org.caosdb.api.entity.v1.Value.Builder result = null; String selector = s.getSelector(); result = handleSpecialSelectors(selector, e); diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java index d39a803f9cfe3ce0a4cf23265683d121b3bc688d..1a3489d86ae602679cff5b53d120aa32c9ed7d47 100644 --- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java +++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java @@ -1,10 +1,10 @@ package org.caosdb.server.grpc; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.TimeZone; +import org.caosdb.api.entity.v1.Value.Builder; import org.caosdb.datetime.DateTimeFactory2; import org.caosdb.server.datatype.GenericValue; import org.caosdb.server.datatype.Value; @@ -17,6 +17,7 @@ import org.caosdb.server.entity.StatementStatus; import org.caosdb.server.entity.wrapper.Parent; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.xml.IdAndServerMessagesOnlyStrategy; +import org.caosdb.server.query.Query.Selection; import org.junit.jupiter.api.Test; public class CaosDBToGrpcConvertersTest { @@ -27,7 +28,9 @@ public class CaosDBToGrpcConvertersTest { DateTimeFactory2 factory = new DateTimeFactory2(timeZone); CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(timeZone); Value value = null; - assertNull(converters.convertScalarValue(value)); + assertEquals( + converters.convertScalarValue(value).toString(), + "special_value: SPECIAL_VALUE_UNSPECIFIED\n"); value = factory.parse("2022"); assertEquals(converters.convertScalarValue(value).toString(), "string_value: \"2022\"\n"); value = factory.parse("2022-12"); @@ -101,4 +104,19 @@ public class CaosDBToGrpcConvertersTest { converters.convert(entity).toString(), "entity {\n id: \"1234\"\n}\nerrors {\n code: 1\n description: \"error\"\n}\nwarnings {\n code: 1\n description: \"warning\"\n}\ninfos {\n code: 1\n description: \"info\"\n}\n"); } + + @Test + public void testGetSelectedValueWithNullValue() { + Property p = new Property(new RetrieveEntity()); + p.setName("p0"); + p.setDatatype("DOUBLE"); + RetrieveEntity entity = new RetrieveEntity(); + entity.addProperty(p); + + CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(null); + Builder value = converters.getSelectedValue(new Selection("p0"), entity); + assertEquals( + "scalar_value {\n" + " special_value: SPECIAL_VALUE_UNSPECIFIED\n" + "}\n", + value.toString()); + } }