diff --git a/core/src/main/java/io/substrait/function/ToTypeString.java b/core/src/main/java/io/substrait/function/ToTypeString.java
index 5c942f46a..a17f80b6b 100644
--- a/core/src/main/java/io/substrait/function/ToTypeString.java
+++ b/core/src/main/java/io/substrait/function/ToTypeString.java
@@ -2,6 +2,10 @@
import io.substrait.type.Type;
+/**
+ * Converts types to their short name string representations as defined by the Substrait specification
+ */
public class ToTypeString
extends ParameterizedTypeVisitor.ParameterizedTypeThrowsVisitor {
@@ -57,7 +61,7 @@ public String visit(final Type.Str expr) {
@Override
public String visit(final Type.Binary expr) {
- return "binary";
+ return "vbin";
}
@Override
@@ -112,7 +116,7 @@ public String visit(final Type.VarChar expr) {
@Override
public String visit(final Type.FixedBinary expr) {
- return "fbinary";
+ return "fbin";
}
@Override
@@ -172,7 +176,7 @@ public String visit(ParameterizedType.VarChar expr) throws RuntimeException {
@Override
public String visit(ParameterizedType.FixedBinary expr) throws RuntimeException {
- return "fbinary";
+ return "fbin";
}
@Override
diff --git a/core/src/test/java/io/substrait/function/ToTypeStringTest.java b/core/src/test/java/io/substrait/function/ToTypeStringTest.java
new file mode 100644
index 000000000..02f81411a
--- /dev/null
+++ b/core/src/test/java/io/substrait/function/ToTypeStringTest.java
@@ -0,0 +1,73 @@
+package io.substrait.function;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import io.substrait.type.Type;
+import io.substrait.type.TypeCreator;
+import java.util.stream.Stream;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class ToTypeStringTest {
+
+ static Stream types() {
+ return Stream.of(TypeCreator.REQUIRED, TypeCreator.NULLABLE)
+ .flatMap(
+ c ->
+ Stream.of(
+ Arguments.of(c.BOOLEAN, "bool"),
+ Arguments.of(c.I8, "i8"),
+ Arguments.of(c.I16, "i16"),
+ Arguments.of(c.I32, "i32"),
+ Arguments.of(c.I64, "i64"),
+ Arguments.of(c.FP32, "fp32"),
+ Arguments.of(c.FP64, "fp64"),
+ Arguments.of(c.STRING, "str"),
+ Arguments.of(c.BINARY, "vbin"),
+ Arguments.of(c.DATE, "date"),
+ Arguments.of(c.TIME, "time"),
+ Arguments.of(c.TIMESTAMP, "ts"),
+ Arguments.of(c.TIMESTAMP_TZ, "tstz"),
+ Arguments.of(c.INTERVAL_YEAR, "iyear"),
+ Arguments.of(c.UUID, "uuid"),
+ Arguments.of(c.fixedChar(1), "fchar"),
+ Arguments.of(c.varChar(1), "vchar"),
+ Arguments.of(c.fixedBinary(1), "fbin"),
+ Arguments.of(c.decimal(10, 2), "dec"),
+ Arguments.of(c.intervalDay(6), "iday"),
+ Arguments.of(c.intervalCompound(3), "icompound"),
+ Arguments.of(c.precisionTime(3), "pt"),
+ Arguments.of(c.precisionTimestamp(3), "pts"),
+ Arguments.of(c.precisionTimestampTZ(3), "ptstz"),
+ Arguments.of(c.struct(c.I32), "struct"),
+ Arguments.of(c.list(c.I32), "list"),
+ Arguments.of(c.map(c.I32, c.I64), "map")));
+ }
+
+ @ParameterizedTest
+ @MethodSource("types")
+ void typeToShortName(Type type, String expected) {
+ assertEquals(expected, ToTypeString.apply(type));
+ }
+
+ @Test
+ void userDefined() {
+ assertEquals("u!point", ToTypeString.apply(TypeCreator.REQUIRED.userDefined("urn", "point")));
+ }
+
+ @Test
+ void anyCollapsesNumericSuffix() {
+ ParameterizedType.StringLiteral any1 =
+ ParameterizedType.StringLiteral.builder().nullable(false).value("any1").build();
+ assertEquals("any", any1.accept(ToTypeString.INSTANCE));
+ }
+
+ @Test
+ void losslessPreservesNumericSuffix() {
+ ParameterizedType.StringLiteral any1 =
+ ParameterizedType.StringLiteral.builder().nullable(false).value("any1").build();
+ assertEquals("any1", any1.accept(ToTypeString.ToTypeLiteralStringLossless.INSTANCE));
+ }
+}