From 91d74c82015c8ae1f1db652f2d8f39fed31c07f9 Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Tue, 5 Nov 2019 14:39:14 -0800 Subject: [PATCH 1/5] Use getDisplayName instead of TypeSignature in error message --- .../java/io/prestosql/sql/planner/ExpressionInterpreter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java b/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java index 4478ae0952eb3..a2e4c30757872 100644 --- a/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java +++ b/presto-main/src/main/java/io/prestosql/sql/planner/ExpressionInterpreter.java @@ -181,8 +181,8 @@ public static Object evaluateConstantExpression(Expression expression, Type expe Type actualType = analyzer.getExpressionTypes().get(NodeRef.of(expression)); if (!new TypeCoercion(metadata::getType).canCoerce(actualType, expectedType)) { throw semanticException(TYPE_MISMATCH, expression, format("Cannot cast type %s to %s", - actualType.getTypeSignature(), - expectedType.getTypeSignature())); + actualType.getDisplayName(), + expectedType.getDisplayName())); } Map, Type> coercions = ImmutableMap., Type>builder() From e566da295ef15cdf0eefafbdadf0229f9f7f4c1e Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Tue, 5 Nov 2019 15:01:31 -0800 Subject: [PATCH 2/5] Quote identifier name during row subscript desugar Names can be reserved SQL keywords, so we need to quote them to avoid issues when deserializing plans on workers. --- .../sql/planner/DesugarRowSubscriptRewriter.java | 2 +- .../io/prestosql/tests/TestTpchDistributedQueries.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/presto-main/src/main/java/io/prestosql/sql/planner/DesugarRowSubscriptRewriter.java b/presto-main/src/main/java/io/prestosql/sql/planner/DesugarRowSubscriptRewriter.java index dd36c0c4a9604..cab3092acd305 100644 --- a/presto-main/src/main/java/io/prestosql/sql/planner/DesugarRowSubscriptRewriter.java +++ b/presto-main/src/main/java/io/prestosql/sql/planner/DesugarRowSubscriptRewriter.java @@ -89,7 +89,7 @@ public Expression rewriteSubscriptExpression(SubscriptExpression node, Void cont // Do not cast if Row fields are named if (fieldName.isPresent()) { - result = new DereferenceExpression(base, new Identifier(fieldName.get())); + result = new DereferenceExpression(base, new Identifier(fieldName.get(), true)); } else { // Cast to Row with named fields diff --git a/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java b/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java index 73dbb747756ad..6ec44068cdefd 100644 --- a/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java +++ b/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java @@ -145,6 +145,16 @@ public void testShowTables() assertQueryFails("SHOW TABLES FROM sf0", "line 1:1: Schema 'sf0' does not exist"); } + @Test + public void testRowSubscriptWithReservedKeyword() + { + // Subscript over field named after reserved keyword. This test needs to run in distributed + // mode, as it uncovers a problem during deserialization plan expressions + assertQuery( + "SELECT cast(row(1) AS row(\"cross\" bigint))[1]", + "VALUES 1"); + } + private Session createSession(String schemaName) { return testSessionBuilder() From e65e10a67ff3ae5d1473c81b901fe07a2b5112ff Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Tue, 5 Nov 2019 17:35:01 -0800 Subject: [PATCH 3/5] Use display name for Type's toString --- .../plugin/hive/TestHiveTypeTranslator.java | 2 +- .../io/prestosql/type/TestJsonOperators.java | 8 +++---- .../io/prestosql/type/TestMapOperators.java | 24 +++++++++---------- .../io/prestosql/type/TestRowOperators.java | 4 ++-- .../prestosql/orc/TestStructColumnReader.java | 2 +- .../io/prestosql/spi/type/AbstractType.java | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/presto-hive/src/test/java/io/prestosql/plugin/hive/TestHiveTypeTranslator.java b/presto-hive/src/test/java/io/prestosql/plugin/hive/TestHiveTypeTranslator.java index c052ac44ecd05..953b289d013a3 100644 --- a/presto-hive/src/test/java/io/prestosql/plugin/hive/TestHiveTypeTranslator.java +++ b/presto-hive/src/test/java/io/prestosql/plugin/hive/TestHiveTypeTranslator.java @@ -94,7 +94,7 @@ public void testTypeTranslator() assertInvalidTypeTranslation( RowType.anonymous(ImmutableList.of(INTEGER, VARBINARY)), NOT_SUPPORTED.toErrorCode(), - "Anonymous row type is not supported in Hive. Please give each field a name: row(integer,varbinary)"); + "Anonymous row type is not supported in Hive. Please give each field a name: row(integer, varbinary)"); } private void assertTypeTranslation(Type type, HiveType hiveType) diff --git a/presto-main/src/test/java/io/prestosql/type/TestJsonOperators.java b/presto-main/src/test/java/io/prestosql/type/TestJsonOperators.java index 96434b28e6758..07ea01e56f3cf 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestJsonOperators.java +++ b/presto-main/src/test/java/io/prestosql/type/TestJsonOperators.java @@ -405,8 +405,8 @@ public void testCastWithJsonParse() // Since we will not reformat the JSON string before parse and cast with the optimization, // these extra whitespaces in JSON string is to make sure the cast will work in such cases. assertCastWithJsonParse("{\"a\"\n:1, \"b\":\t2}", "MAP(VARCHAR,INTEGER)", mapType(VARCHAR, INTEGER), ImmutableMap.of("a", 1, "b", 2)); - assertInvalidCastWithJsonParse("{\"[1, 1]\":[2, 2]}", "MAP(ARRAY(INTEGER),ARRAY(INTEGER))", "Cannot cast JSON to map(array(integer),array(integer))"); - assertInvalidCastWithJsonParse("{true: false, false:false}", "MAP(BOOLEAN,BOOLEAN)", "Cannot cast to map(boolean,boolean).\n{true: false, false:false}"); + assertInvalidCastWithJsonParse("{\"[1, 1]\":[2, 2]}", "MAP(ARRAY(INTEGER),ARRAY(INTEGER))", "Cannot cast JSON to map(array(integer), array(integer))"); + assertInvalidCastWithJsonParse("{true: false, false:false}", "MAP(BOOLEAN,BOOLEAN)", "Cannot cast to map(boolean, boolean).\n{true: false, false:false}"); assertCastWithJsonParse( "{\"a\" \n :1, \"b\": \t [2, 3]}", @@ -423,11 +423,11 @@ public void testCastWithJsonParse() assertInvalidCastWithJsonParse( "{\"a\" :1, \"b\": {} }", "ROW(a INTEGER, b ARRAY(INTEGER))", - "Cannot cast to row(a integer,b array(integer)). Expected a json array, but got {\n{\"a\" :1, \"b\": {} }"); + "Cannot cast to row(a integer, b array(integer)). Expected a json array, but got {\n{\"a\" :1, \"b\": {} }"); assertInvalidCastWithJsonParse( "[ 1, {} ]", "ROW(INTEGER, ARRAY(INTEGER))", - "Cannot cast to row(integer,array(integer)). Expected a json array, but got {\n[ 1, {} ]"); + "Cannot cast to row(integer, array(integer)). Expected a json array, but got {\n[ 1, {} ]"); } @Test diff --git a/presto-main/src/test/java/io/prestosql/type/TestMapOperators.java b/presto-main/src/test/java/io/prestosql/type/TestMapOperators.java index 5e7a60fdd6159..dadaae5b3a24f 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestMapOperators.java +++ b/presto-main/src/test/java/io/prestosql/type/TestMapOperators.java @@ -443,22 +443,22 @@ public void testJsonToMap() null))); // invalid cast - assertInvalidCast("CAST(JSON '{\"[]\": 1}' AS MAP, BIGINT>)", "Cannot cast JSON to map(array(bigint),bigint)"); + assertInvalidCast("CAST(JSON '{\"[]\": 1}' AS MAP, BIGINT>)", "Cannot cast JSON to map(array(bigint), bigint)"); - assertInvalidCast("CAST(JSON '[1, 2]' AS MAP)", "Cannot cast to map(bigint,bigint). Expected a json object, but got [\n[1,2]"); - assertInvalidCast("CAST(JSON '{\"a\": 1, \"b\": 2}' AS MAP>)", "Cannot cast to map(varchar,map(varchar,bigint)). Expected a json object, but got 1\n{\"a\":1,\"b\":2}"); - assertInvalidCast("CAST(JSON '{\"a\": 1, \"b\": []}' AS MAP)", "Cannot cast to map(varchar,bigint). Unexpected token when cast to bigint: [\n{\"a\":1,\"b\":[]}"); - assertInvalidCast("CAST(JSON '{\"1\": {\"a\": 1}, \"2\": []}' AS MAP>)", "Cannot cast to map(varchar,map(varchar,bigint)). Expected a json object, but got [\n{\"1\":{\"a\":1},\"2\":[]}"); + assertInvalidCast("CAST(JSON '[1, 2]' AS MAP)", "Cannot cast to map(bigint, bigint). Expected a json object, but got [\n[1,2]"); + assertInvalidCast("CAST(JSON '{\"a\": 1, \"b\": 2}' AS MAP>)", "Cannot cast to map(varchar, map(varchar, bigint)). Expected a json object, but got 1\n{\"a\":1,\"b\":2}"); + assertInvalidCast("CAST(JSON '{\"a\": 1, \"b\": []}' AS MAP)", "Cannot cast to map(varchar, bigint). Unexpected token when cast to bigint: [\n{\"a\":1,\"b\":[]}"); + assertInvalidCast("CAST(JSON '{\"1\": {\"a\": 1}, \"2\": []}' AS MAP>)", "Cannot cast to map(varchar, map(varchar, bigint)). Expected a json object, but got [\n{\"1\":{\"a\":1},\"2\":[]}"); - assertInvalidCast("CAST(unchecked_to_json('\"a\": 1, \"b\": 2') AS MAP)", "Cannot cast to map(varchar,bigint). Expected a json object, but got a\n\"a\": 1, \"b\": 2"); - assertInvalidCast("CAST(unchecked_to_json('{\"a\": 1} 2') AS MAP)", "Cannot cast to map(varchar,bigint). Unexpected trailing token: 2\n{\"a\": 1} 2"); - assertInvalidCast("CAST(unchecked_to_json('{\"a\": 1') AS MAP)", "Cannot cast to map(varchar,bigint).\n{\"a\": 1"); + assertInvalidCast("CAST(unchecked_to_json('\"a\": 1, \"b\": 2') AS MAP)", "Cannot cast to map(varchar, bigint). Expected a json object, but got a\n\"a\": 1, \"b\": 2"); + assertInvalidCast("CAST(unchecked_to_json('{\"a\": 1} 2') AS MAP)", "Cannot cast to map(varchar, bigint). Unexpected trailing token: 2\n{\"a\": 1} 2"); + assertInvalidCast("CAST(unchecked_to_json('{\"a\": 1') AS MAP)", "Cannot cast to map(varchar, bigint).\n{\"a\": 1"); - assertInvalidCast("CAST(JSON '{\"a\": \"b\"}' AS MAP)", "Cannot cast to map(varchar,bigint). Cannot cast 'b' to BIGINT\n{\"a\":\"b\"}"); - assertInvalidCast("CAST(JSON '{\"a\": 1234567890123.456}' AS MAP)", "Cannot cast to map(varchar,integer). Out of range for integer: 1.234567890123456E12\n{\"a\":1.234567890123456E12}"); + assertInvalidCast("CAST(JSON '{\"a\": \"b\"}' AS MAP)", "Cannot cast to map(varchar, bigint). Cannot cast 'b' to BIGINT\n{\"a\":\"b\"}"); + assertInvalidCast("CAST(JSON '{\"a\": 1234567890123.456}' AS MAP)", "Cannot cast to map(varchar, integer). Out of range for integer: 1.234567890123456E12\n{\"a\":1.234567890123456E12}"); - assertInvalidCast("CAST(JSON '{\"1\":1, \"01\": 2}' AS MAP)", "Cannot cast to map(bigint,bigint). Duplicate keys are not allowed\n{\"01\":2,\"1\":1}"); - assertInvalidCast("CAST(JSON '[{\"1\":1, \"01\": 2}]' AS ARRAY>)", "Cannot cast to array(map(bigint,bigint)). Duplicate keys are not allowed\n[{\"01\":2,\"1\":1}]"); + assertInvalidCast("CAST(JSON '{\"1\":1, \"01\": 2}' AS MAP)", "Cannot cast to map(bigint, bigint). Duplicate keys are not allowed\n{\"01\":2,\"1\":1}"); + assertInvalidCast("CAST(JSON '[{\"1\":1, \"01\": 2}]' AS ARRAY>)", "Cannot cast to array(map(bigint, bigint)). Duplicate keys are not allowed\n[{\"01\":2,\"1\":1}]"); // some other key/value type combinations assertFunction("CAST(JSON '{\"puppies\":\"kittens\"}' AS MAP)", diff --git a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java index 2aa0d220d1f0c..e1b8f39f70548 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java +++ b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java @@ -357,8 +357,8 @@ public void testJsonToRow() null, asList(1L, 2L, 3L, null))); // invalid cast - assertInvalidCast("CAST(unchecked_to_json('{\"a\":1,\"b\":2,\"a\":3}') AS ROW(a BIGINT, b BIGINT))", "Cannot cast to row(a bigint,b bigint). Duplicate field: a\n{\"a\":1,\"b\":2,\"a\":3}"); - assertInvalidCast("CAST(unchecked_to_json('[{\"a\":1,\"b\":2,\"a\":3}]') AS ARRAY(ROW(a BIGINT, b BIGINT)))", "Cannot cast to array(row(a bigint,b bigint)). Duplicate field: a\n[{\"a\":1,\"b\":2,\"a\":3}]"); + assertInvalidCast("CAST(unchecked_to_json('{\"a\":1,\"b\":2,\"a\":3}') AS ROW(a BIGINT, b BIGINT))", "Cannot cast to row(a bigint, b bigint). Duplicate field: a\n{\"a\":1,\"b\":2,\"a\":3}"); + assertInvalidCast("CAST(unchecked_to_json('[{\"a\":1,\"b\":2,\"a\":3}]') AS ARRAY(ROW(a BIGINT, b BIGINT)))", "Cannot cast to array(row(a bigint, b bigint)). Duplicate field: a\n[{\"a\":1,\"b\":2,\"a\":3}]"); } @Test diff --git a/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java b/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java index 8025737282af0..c0b2a6c5c6600 100644 --- a/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java +++ b/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java @@ -152,7 +152,7 @@ public void testReaderLowerCasesFieldNamesFromType() } @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = - "ROW type does not have field names declared: row\\(varchar,varchar,varchar\\)") + "ROW type does not have field names declared: row\\(varchar, varchar, varchar\\)") public void testThrowsExceptionWhenFieldNameMissing() throws IOException { diff --git a/presto-spi/src/main/java/io/prestosql/spi/type/AbstractType.java b/presto-spi/src/main/java/io/prestosql/spi/type/AbstractType.java index 53bd7de97302c..7c981207c5df3 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/type/AbstractType.java +++ b/presto-spi/src/main/java/io/prestosql/spi/type/AbstractType.java @@ -156,7 +156,7 @@ public void writeObject(BlockBuilder blockBuilder, Object value) @Override public String toString() { - return getTypeSignature().toString(); + return getDisplayName(); } @Override From da2f1ff8032f241dc45e26c9fd6146e5a962d4a2 Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Tue, 5 Nov 2019 17:38:17 -0800 Subject: [PATCH 4/5] Remove use of TypeSignature from OperatorNotFoundException --- .../java/io/prestosql/metadata/FunctionRegistry.java | 8 ++------ .../prestosql/metadata/OperatorNotFoundException.java | 11 ++++++----- .../test/java/io/prestosql/type/TestRowOperators.java | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/presto-main/src/main/java/io/prestosql/metadata/FunctionRegistry.java b/presto-main/src/main/java/io/prestosql/metadata/FunctionRegistry.java index e4dbafe1af53d..e5ea57abd3c07 100644 --- a/presto-main/src/main/java/io/prestosql/metadata/FunctionRegistry.java +++ b/presto-main/src/main/java/io/prestosql/metadata/FunctionRegistry.java @@ -1029,11 +1029,7 @@ public ResolvedFunction resolveOperator(OperatorType operatorType, List argumentTypes; + private final List argumentTypes; - public OperatorNotFoundException(OperatorType operatorType, List argumentTypes) + public OperatorNotFoundException(OperatorType operatorType, List argumentTypes) { super(OPERATOR_NOT_FOUND, formatErrorMessage(operatorType, argumentTypes, Optional.empty())); this.operatorType = requireNonNull(operatorType, "operatorType is null"); @@ -41,7 +42,7 @@ public OperatorNotFoundException(OperatorType operatorType, List argumentTypes, TypeSignature returnType) + public OperatorNotFoundException(OperatorType operatorType, List argumentTypes, TypeSignature returnType) { super(OPERATOR_NOT_FOUND, formatErrorMessage(operatorType, argumentTypes, Optional.of(returnType))); this.operatorType = requireNonNull(operatorType, "operatorType is null"); @@ -49,7 +50,7 @@ public OperatorNotFoundException(OperatorType operatorType, List argumentTypes, Optional returnType) + private static String formatErrorMessage(OperatorType operatorType, List argumentTypes, Optional returnType) { String operatorString; switch (operatorType) { @@ -74,7 +75,7 @@ public TypeSignature getReturnType() return returnType; } - public List getArgumentTypes() + public List getArgumentTypes() { return argumentTypes; } diff --git a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java index e1b8f39f70548..25307c6a9b397 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java +++ b/presto-main/src/test/java/io/prestosql/type/TestRowOperators.java @@ -481,7 +481,7 @@ public void testRowComparison() assertFunction("row(2, CAST(NULL AS INTEGER)) = row(1, 2)", BOOLEAN, false); assertFunction("row(2, CAST(NULL AS INTEGER)) != row(1, 2)", BOOLEAN, true); assertInvalidFunction("row(TRUE, ARRAY [1, 2], MAP(ARRAY[1, 3], ARRAY[2.0E0, 4.0E0])) > row(TRUE, ARRAY [1, 2], MAP(ARRAY[1, 3], ARRAY[2.0E0, 4.0E0]))", - TYPE_MISMATCH, "line 1:64: '>' cannot be applied to row(boolean,array(integer),map(integer,double)), row(boolean,array(integer),map(integer,double))"); + TYPE_MISMATCH, "line 1:64: '>' cannot be applied to row(boolean, array(integer), map(integer, double)), row(boolean, array(integer), map(integer, double))"); assertInvalidFunction("row(1, CAST(NULL AS INTEGER)) < row(1, 2)", StandardErrorCode.NOT_SUPPORTED); From 9adf159e4dd4b91127409d8385528cb8cd0e465a Mon Sep 17 00:00:00 2001 From: Martin Traverso Date: Wed, 6 Nov 2019 08:34:30 -0800 Subject: [PATCH 5/5] Quote field names in TypeSignature TypeSignature is used for encoding the identity of a type, which is then parsed (for now) using the SQL parser. Since some fields names might collide with SQL reserved words, we need to quote them. --- .../io/prestosql/client/RowFieldName.java | 19 +----- .../client/TestClientTypeSignature.java | 8 +-- .../client/TestFixJsonDataUtils.java | 2 +- .../io/prestosql/plugin/hive/HiveType.java | 2 +- .../plugin/hive/AbstractTestHive.java | 8 +-- .../operator/TypeSignatureParser.java | 6 +- .../io/prestosql/server/protocol/Query.java | 2 +- .../sql/analyzer/TypeSignatureTranslator.java | 2 +- .../prestosql/operator/TestTypeSignature.java | 59 +++++++++---------- .../prestosql/type/TestRowParametricType.java | 4 +- .../plugin/mongodb/MongoSession.java | 4 +- .../test/java/io/prestosql/orc/OrcTester.java | 2 +- .../prestosql/orc/TestStructColumnReader.java | 2 +- .../legacy/storage/OrcStorageManager.java | 2 +- .../spi/type/NamedTypeSignature.java | 2 +- .../io/prestosql/spi/type/RowFieldName.java | 18 +----- .../java/io/prestosql/spi/type/RowType.java | 2 +- .../spi/type/TypeSignatureParameter.java | 2 +- .../tests/TestTpchDistributedQueries.java | 10 ++++ 19 files changed, 70 insertions(+), 86 deletions(-) diff --git a/presto-client/src/main/java/io/prestosql/client/RowFieldName.java b/presto-client/src/main/java/io/prestosql/client/RowFieldName.java index a0feda345811e..c92684878fd47 100644 --- a/presto-client/src/main/java/io/prestosql/client/RowFieldName.java +++ b/presto-client/src/main/java/io/prestosql/client/RowFieldName.java @@ -23,15 +23,12 @@ public class RowFieldName { private final String name; - private final boolean delimited; @JsonCreator public RowFieldName( - @JsonProperty("name") String name, - @JsonProperty("delimited") boolean delimited) + @JsonProperty("name") String name) { this.name = requireNonNull(name, "name is null"); - this.delimited = delimited; } @JsonProperty @@ -40,12 +37,6 @@ public String getName() return name; } - @JsonProperty - public boolean isDelimited() - { - return delimited; - } - @Override public boolean equals(Object o) { @@ -58,22 +49,18 @@ public boolean equals(Object o) RowFieldName other = (RowFieldName) o; - return Objects.equals(this.name, other.name) && - Objects.equals(this.delimited, other.delimited); + return Objects.equals(this.name, other.name); } @Override public String toString() { - if (!isDelimited()) { - return name; - } return '"' + name.replace("\"", "\"\"") + '"'; } @Override public int hashCode() { - return Objects.hash(name, delimited); + return Objects.hash(name); } } diff --git a/presto-client/src/test/java/io/prestosql/client/TestClientTypeSignature.java b/presto-client/src/test/java/io/prestosql/client/TestClientTypeSignature.java index ae546c30ce08e..488c0bd26763e 100644 --- a/presto-client/src/test/java/io/prestosql/client/TestClientTypeSignature.java +++ b/presto-client/src/test/java/io/prestosql/client/TestClientTypeSignature.java @@ -48,8 +48,8 @@ public void testJsonRoundTrip() assertJsonRoundTrip(new ClientTypeSignature( "row", ImmutableList.of( - ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("foo", false)), bigint)), - ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("bar", false)), bigint))))); + ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("foo")), bigint)), + ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("bar")), bigint))))); } @Test @@ -64,8 +64,8 @@ public void testStringSerialization() ClientTypeSignature row = new ClientTypeSignature( StandardTypes.ROW, ImmutableList.of( - ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("foo", false)), bigint)), - ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("bar", false)), bigint)))); + ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("foo")), bigint)), + ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature(Optional.of(new RowFieldName("bar")), bigint)))); assertEquals(row.toString(), "row(foo bigint,bar bigint)"); } diff --git a/presto-client/src/test/java/io/prestosql/client/TestFixJsonDataUtils.java b/presto-client/src/test/java/io/prestosql/client/TestFixJsonDataUtils.java index 4815e15979e8a..40ecc0b346ecb 100644 --- a/presto-client/src/test/java/io/prestosql/client/TestFixJsonDataUtils.java +++ b/presto-client/src/test/java/io/prestosql/client/TestFixJsonDataUtils.java @@ -117,7 +117,7 @@ private static ClientTypeSignatureParameter toClientTypeSignatureParameter(TypeS case NAMED_TYPE: return ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature( parameter.getNamedTypeSignature().getFieldName().map(value -> - new RowFieldName(value.getName(), value.isDelimited())), + new RowFieldName(value.getName())), toClientTypeSignature(parameter.getNamedTypeSignature().getTypeSignature()))); case LONG: return ClientTypeSignatureParameter.ofLong(parameter.getLongLiteral()); diff --git a/presto-hive/src/main/java/io/prestosql/plugin/hive/HiveType.java b/presto-hive/src/main/java/io/prestosql/plugin/hive/HiveType.java index 450ec79cd8f3a..393d5ee3348fb 100644 --- a/presto-hive/src/main/java/io/prestosql/plugin/hive/HiveType.java +++ b/presto-hive/src/main/java/io/prestosql/plugin/hive/HiveType.java @@ -236,7 +236,7 @@ private static TypeSignature getTypeSignature(TypeInfo typeInfo) // Users can't work around this by casting in their queries because Presto parser always lower case types. // TODO: This is a hack. Presto engine should be able to handle identifiers in a case insensitive way where necessary. String rowFieldName = structFieldNames.get(i).toLowerCase(Locale.US); - typeSignatureBuilder.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(rowFieldName, false)), typeSignature))); + typeSignatureBuilder.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(rowFieldName)), typeSignature))); } return new TypeSignature(StandardTypes.ROW, typeSignatureBuilder.build()); } diff --git a/presto-hive/src/test/java/io/prestosql/plugin/hive/AbstractTestHive.java b/presto-hive/src/test/java/io/prestosql/plugin/hive/AbstractTestHive.java index b6aa9c9180877..1e40dfc6a2807 100644 --- a/presto-hive/src/test/java/io/prestosql/plugin/hive/AbstractTestHive.java +++ b/presto-hive/src/test/java/io/prestosql/plugin/hive/AbstractTestHive.java @@ -283,9 +283,9 @@ public abstract class AbstractTestHive private static final Type ARRAY_TYPE = arrayType(createUnboundedVarcharType()); private static final Type MAP_TYPE = mapType(createUnboundedVarcharType(), BIGINT); private static final Type ROW_TYPE = rowType(ImmutableList.of( - new NamedTypeSignature(Optional.of(new RowFieldName("f_string", false)), createUnboundedVarcharType().getTypeSignature()), - new NamedTypeSignature(Optional.of(new RowFieldName("f_bigint", false)), BIGINT.getTypeSignature()), - new NamedTypeSignature(Optional.of(new RowFieldName("f_boolean", false)), BOOLEAN.getTypeSignature()))); + new NamedTypeSignature(Optional.of(new RowFieldName("f_string")), createUnboundedVarcharType().getTypeSignature()), + new NamedTypeSignature(Optional.of(new RowFieldName("f_bigint")), BIGINT.getTypeSignature()), + new NamedTypeSignature(Optional.of(new RowFieldName("f_boolean")), BOOLEAN.getTypeSignature()))); private static final List CREATE_TABLE_COLUMNS = ImmutableList.builder() .add(new ColumnMetadata("id", BIGINT)) @@ -356,7 +356,7 @@ public abstract class AbstractTestHive private static RowType toRowType(List columns) { return rowType(columns.stream() - .map(col -> new NamedTypeSignature(Optional.of(new RowFieldName(format("f_%s", col.getName()), false)), col.getType().getTypeSignature())) + .map(col -> new NamedTypeSignature(Optional.of(new RowFieldName(format("f_%s", col.getName()))), col.getType().getTypeSignature())) .collect(toImmutableList())); } diff --git a/presto-main/src/main/java/io/prestosql/operator/TypeSignatureParser.java b/presto-main/src/main/java/io/prestosql/operator/TypeSignatureParser.java index fbfeee9019c4c..565c1409da913 100644 --- a/presto-main/src/main/java/io/prestosql/operator/TypeSignatureParser.java +++ b/presto-main/src/main/java/io/prestosql/operator/TypeSignatureParser.java @@ -194,7 +194,7 @@ else if (c == ')') { verify(tokenStart >= 0, "Expect tokenStart to be non-negative"); verify(delimitedColumnName != null, "Expect delimitedColumnName to be non-null"); fields.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature( - Optional.of(new RowFieldName(delimitedColumnName, true)), + Optional.of(new RowFieldName(delimitedColumnName)), parseTypeSignature(signature.substring(tokenStart, i).trim(), literalParameters)))); delimitedColumnName = null; tokenStart = -1; @@ -204,7 +204,7 @@ else if (c == ',' && bracketLevel == 1) { verify(tokenStart >= 0, "Expect tokenStart to be non-negative"); verify(delimitedColumnName != null, "Expect delimitedColumnName to be non-null"); fields.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature( - Optional.of(new RowFieldName(delimitedColumnName, true)), + Optional.of(new RowFieldName(delimitedColumnName)), parseTypeSignature(signature.substring(tokenStart, i).trim(), literalParameters)))); delimitedColumnName = null; tokenStart = -1; @@ -238,7 +238,7 @@ private static TypeSignatureParameter parseTypeOrNamedType(String typeOrNamedTyp String firstPart = typeOrNamedType.substring(0, split); if (IDENTIFIER_PATTERN.matcher(firstPart).matches()) { return TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature( - Optional.of(new RowFieldName(firstPart, false)), + Optional.of(new RowFieldName(firstPart)), parseTypeSignature(typeOrNamedType.substring(split + 1).trim(), literalParameters))); } diff --git a/presto-main/src/main/java/io/prestosql/server/protocol/Query.java b/presto-main/src/main/java/io/prestosql/server/protocol/Query.java index 8ce8be5cce9c3..27e5ac894c47a 100644 --- a/presto-main/src/main/java/io/prestosql/server/protocol/Query.java +++ b/presto-main/src/main/java/io/prestosql/server/protocol/Query.java @@ -594,7 +594,7 @@ private static ClientTypeSignatureParameter toClientTypeSignatureParameter(TypeS case NAMED_TYPE: return ClientTypeSignatureParameter.ofNamedType(new NamedClientTypeSignature( parameter.getNamedTypeSignature().getFieldName().map(value -> - new RowFieldName(value.getName(), value.isDelimited())), + new RowFieldName(value.getName())), toClientTypeSignature(parameter.getNamedTypeSignature().getTypeSignature()))); case LONG: return ClientTypeSignatureParameter.ofLong(parameter.getLongLiteral()); diff --git a/presto-main/src/main/java/io/prestosql/sql/analyzer/TypeSignatureTranslator.java b/presto-main/src/main/java/io/prestosql/sql/analyzer/TypeSignatureTranslator.java index d0c9a61891858..5965eeb15a9b6 100644 --- a/presto-main/src/main/java/io/prestosql/sql/analyzer/TypeSignatureTranslator.java +++ b/presto-main/src/main/java/io/prestosql/sql/analyzer/TypeSignatureTranslator.java @@ -110,7 +110,7 @@ private static TypeSignature toTypeSignature(RowDataType type) .map(field -> namedTypeParameter(new NamedTypeSignature( field.getName() .map(TypeSignatureTranslator::canonicalize) - .map(value -> new RowFieldName(value, false)), + .map(value -> new RowFieldName(value)), toTypeSignature(field.getType())))) .collect(toImmutableList()); diff --git a/presto-main/src/test/java/io/prestosql/operator/TestTypeSignature.java b/presto-main/src/test/java/io/prestosql/operator/TestTypeSignature.java index f51e4e3e0bfb4..cac1f12e30916 100644 --- a/presto-main/src/test/java/io/prestosql/operator/TestTypeSignature.java +++ b/presto-main/src/test/java/io/prestosql/operator/TestTypeSignature.java @@ -64,32 +64,32 @@ public void parseRowSignature() // row signature with named fields assertRowSignature( "row(a bigint,b varchar)", - rowSignature(namedParameter("a", false, signature("bigint")), namedParameter("b", false, varchar()))); + rowSignature(namedParameter("a", signature("bigint")), namedParameter("b", varchar()))); assertRowSignature( "row(__a__ bigint,_b@_: _varchar)", - rowSignature(namedParameter("__a__", false, signature("bigint")), namedParameter("_b@_:", false, signature("_varchar")))); + rowSignature(namedParameter("__a__", signature("bigint")), namedParameter("_b@_:", signature("_varchar")))); assertRowSignature( "row(a bigint,b array(bigint),c row(a bigint))", rowSignature( - namedParameter("a", false, signature("bigint")), - namedParameter("b", false, array(signature("bigint"))), - namedParameter("c", false, rowSignature(namedParameter("a", false, signature("bigint")))))); + namedParameter("a", signature("bigint")), + namedParameter("b", array(signature("bigint"))), + namedParameter("c", rowSignature(namedParameter("a", signature("bigint")))))); assertRowSignature( "row(a varchar(10),b row(a bigint))", rowSignature( - namedParameter("a", false, varchar(10)), - namedParameter("b", false, rowSignature(namedParameter("a", false, signature("bigint")))))); + namedParameter("a", varchar(10)), + namedParameter("b", rowSignature(namedParameter("a", signature("bigint")))))); assertRowSignature( "array(row(col0 bigint,col1 double))", - array(rowSignature(namedParameter("col0", false, signature("bigint")), namedParameter("col1", false, signature("double"))))); + array(rowSignature(namedParameter("col0", signature("bigint")), namedParameter("col1", signature("double"))))); assertRowSignature( "row(col0 array(row(col0 bigint,col1 double)))", - rowSignature(namedParameter("col0", false, array( - rowSignature(namedParameter("col0", false, signature("bigint")), namedParameter("col1", false, signature("double"))))))); + rowSignature(namedParameter("col0", array( + rowSignature(namedParameter("col0", signature("bigint")), namedParameter("col1", signature("double"))))))); assertRowSignature( "row(a decimal(p1,s1),b decimal(p2,s2))", ImmutableSet.of("p1", "s1", "p2", "s2"), - rowSignature(namedParameter("a", false, decimal("p1", "s1")), namedParameter("b", false, decimal("p2", "s2")))); + rowSignature(namedParameter("a", decimal("p1", "s1")), namedParameter("b", decimal("p2", "s2")))); // row with mixed fields assertRowSignature( @@ -100,40 +100,40 @@ public void parseRowSignature() rowSignature( unnamedParameter(signature("bigint")), unnamedParameter(array(signature("bigint"))), - unnamedParameter(rowSignature(namedParameter("a", false, signature("bigint")))))); + unnamedParameter(rowSignature(namedParameter("a", signature("bigint")))))); assertRowSignature( "row(varchar(10),b row(bigint))", rowSignature( unnamedParameter(varchar(10)), - namedParameter("b", false, rowSignature(unnamedParameter(signature("bigint")))))); + namedParameter("b", rowSignature(unnamedParameter(signature("bigint")))))); assertRowSignature( "array(row(col0 bigint,double))", - array(rowSignature(namedParameter("col0", false, signature("bigint")), unnamedParameter(signature("double"))))); + array(rowSignature(namedParameter("col0", signature("bigint")), unnamedParameter(signature("double"))))); assertRowSignature( "row(col0 array(row(bigint,double)))", - rowSignature(namedParameter("col0", false, array( + rowSignature(namedParameter("col0", array( rowSignature(unnamedParameter(signature("bigint")), unnamedParameter(signature("double"))))))); assertRowSignature( "row(a decimal(p1,s1),decimal(p2,s2))", ImmutableSet.of("p1", "s1", "p2", "s2"), - rowSignature(namedParameter("a", false, decimal("p1", "s1")), unnamedParameter(decimal("p2", "s2")))); + rowSignature(namedParameter("a", decimal("p1", "s1")), unnamedParameter(decimal("p2", "s2")))); // named fields of types with spaces assertRowSignature( "row(time time with time zone)", - rowSignature(namedParameter("time", false, signature("time with time zone")))); + rowSignature(namedParameter("time", signature("time with time zone")))); assertRowSignature( "row(time timestamp with time zone)", - rowSignature(namedParameter("time", false, signature("timestamp with time zone")))); + rowSignature(namedParameter("time", signature("timestamp with time zone")))); assertRowSignature( "row(interval interval day to second)", - rowSignature(namedParameter("interval", false, signature("interval day to second")))); + rowSignature(namedParameter("interval", signature("interval day to second")))); assertRowSignature( "row(interval interval year to month)", - rowSignature(namedParameter("interval", false, signature("interval year to month")))); + rowSignature(namedParameter("interval", signature("interval year to month")))); assertRowSignature( "row(double double precision)", - rowSignature(namedParameter("double", false, signature("double precision")))); + rowSignature(namedParameter("double", signature("double precision")))); // unnamed fields of types with spaces assertRowSignature( @@ -162,25 +162,25 @@ public void parseRowSignature() assertRowSignature( "row(\"time with time zone\" time with time zone,\"double\" double)", rowSignature( - namedParameter("time with time zone", true, signature("time with time zone")), - namedParameter("double", true, signature("double")))); + namedParameter("time with time zone", signature("time with time zone")), + namedParameter("double", signature("double")))); // allow spaces assertSignature( "row( time time with time zone, array( interval day to seconds ) )", "row", - ImmutableList.of("time time with time zone", "array(interval day to seconds)"), - "row(time time with time zone,array(interval day to seconds))"); + ImmutableList.of("\"time\" time with time zone", "array(interval day to seconds)"), + "row(\"time\" time with time zone,array(interval day to seconds))"); // preserve base name case assertRowSignature( "RoW(a bigint,b varchar)", - rowSignature(namedParameter("a", false, signature("bigint")), namedParameter("b", false, varchar()))); + rowSignature(namedParameter("a", signature("bigint")), namedParameter("b", varchar()))); // signature with invalid type assertRowSignature( "row(\"time\" with time zone)", - rowSignature(namedParameter("time", true, signature("with time zone")))); + rowSignature(namedParameter("time", signature("with time zone")))); } private TypeSignature varchar() @@ -204,9 +204,9 @@ private static TypeSignature rowSignature(NamedTypeSignature... columns) return new TypeSignature("row", transform(asList(columns), TypeSignatureParameter::namedTypeParameter)); } - private static NamedTypeSignature namedParameter(String name, boolean delimited, TypeSignature value) + private static NamedTypeSignature namedParameter(String name, TypeSignature value) { - return new NamedTypeSignature(Optional.of(new RowFieldName(name, delimited)), value); + return new NamedTypeSignature(Optional.of(new RowFieldName(name)), value); } private static NamedTypeSignature unnamedParameter(TypeSignature value) @@ -302,7 +302,6 @@ private static void assertRowSignature( { TypeSignature signature = parseTypeSignature(typeName, literalParameters); assertEquals(signature, expectedSignature); - assertEquals(signature.toString(), typeName); } private static void assertRowSignature( diff --git a/presto-main/src/test/java/io/prestosql/type/TestRowParametricType.java b/presto-main/src/test/java/io/prestosql/type/TestRowParametricType.java index 3d3ebd2680c86..c4484c45ef05c 100644 --- a/presto-main/src/test/java/io/prestosql/type/TestRowParametricType.java +++ b/presto-main/src/test/java/io/prestosql/type/TestRowParametricType.java @@ -40,8 +40,8 @@ public void testTypeSignatureRoundTrip() TypeManager typeManager = new InternalTypeManager(createTestMetadataManager()); TypeSignature typeSignature = new TypeSignature( ROW, - TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col1", false)), BIGINT.getTypeSignature())), - TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col2", true)), DOUBLE.getTypeSignature()))); + TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col1")), BIGINT.getTypeSignature())), + TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col2")), DOUBLE.getTypeSignature()))); List parameters = typeSignature.getParameters().stream() .map(parameter -> TypeParameter.of(parameter, typeManager)) .collect(Collectors.toList()); diff --git a/presto-mongodb/src/main/java/io/prestosql/plugin/mongodb/MongoSession.java b/presto-mongodb/src/main/java/io/prestosql/plugin/mongodb/MongoSession.java index ea56a9b060714..d985a254fa421 100644 --- a/presto-mongodb/src/main/java/io/prestosql/plugin/mongodb/MongoSession.java +++ b/presto-mongodb/src/main/java/io/prestosql/plugin/mongodb/MongoSession.java @@ -538,7 +538,7 @@ else if (value instanceof List) { typeSignature = new TypeSignature(StandardTypes.ROW, IntStream.range(0, subTypes.size()) .mapToObj(idx -> TypeSignatureParameter.namedTypeParameter( - new NamedTypeSignature(Optional.of(new RowFieldName(format("%s%d", implicitPrefix, idx + 1), false)), subTypes.get(idx).get()))) + new NamedTypeSignature(Optional.of(new RowFieldName(format("%s%d", implicitPrefix, idx + 1))), subTypes.get(idx).get()))) .collect(toList())); } } @@ -551,7 +551,7 @@ else if (value instanceof Document) { return Optional.empty(); } - parameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(key, false)), fieldType.get()))); + parameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(key)), fieldType.get()))); } typeSignature = new TypeSignature(StandardTypes.ROW, parameters); } diff --git a/presto-orc/src/test/java/io/prestosql/orc/OrcTester.java b/presto-orc/src/test/java/io/prestosql/orc/OrcTester.java index ab220dce52670..93dd1e1437aca 100644 --- a/presto-orc/src/test/java/io/prestosql/orc/OrcTester.java +++ b/presto-orc/src/test/java/io/prestosql/orc/OrcTester.java @@ -1109,7 +1109,7 @@ private static Type rowType(Type... fieldTypes) for (int i = 0; i < fieldTypes.length; i++) { String filedName = "field_" + i; Type fieldType = fieldTypes[i]; - typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(filedName, false)), fieldType.getTypeSignature()))); + typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(filedName)), fieldType.getTypeSignature()))); } return METADATA.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); } diff --git a/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java b/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java index c0b2a6c5c6600..4296d9147372a 100644 --- a/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java +++ b/presto-orc/src/test/java/io/prestosql/orc/TestStructColumnReader.java @@ -281,7 +281,7 @@ private Type getType(List fieldNames) { ImmutableList.Builder typeSignatureParameters = ImmutableList.builder(); for (String fieldName : fieldNames) { - typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(fieldName, false)), TEST_DATA_TYPE.getTypeSignature()))); + typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(fieldName)), TEST_DATA_TYPE.getTypeSignature()))); } return METADATA.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); } diff --git a/presto-raptor-legacy/src/main/java/io/prestosql/plugin/raptor/legacy/storage/OrcStorageManager.java b/presto-raptor-legacy/src/main/java/io/prestosql/plugin/raptor/legacy/storage/OrcStorageManager.java index 83cf9f72708f9..b944970f2bf59 100644 --- a/presto-raptor-legacy/src/main/java/io/prestosql/plugin/raptor/legacy/storage/OrcStorageManager.java +++ b/presto-raptor-legacy/src/main/java/io/prestosql/plugin/raptor/legacy/storage/OrcStorageManager.java @@ -542,7 +542,7 @@ private Type getType(ColumnMetadata types, OrcColumnId columnId) ImmutableList.Builder fieldTypes = ImmutableList.builder(); for (int i = 0; i < type.getFieldCount(); i++) { fieldTypes.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature( - Optional.of(new RowFieldName(fieldNames.get(i), false)), + Optional.of(new RowFieldName(fieldNames.get(i))), getType(types, type.getFieldTypeIndex(i)).getTypeSignature()))); } return typeManager.getParameterizedType(StandardTypes.ROW, fieldTypes.build()); diff --git a/presto-spi/src/main/java/io/prestosql/spi/type/NamedTypeSignature.java b/presto-spi/src/main/java/io/prestosql/spi/type/NamedTypeSignature.java index c04a9cb99fe3d..0ce79ffbf7964 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/type/NamedTypeSignature.java +++ b/presto-spi/src/main/java/io/prestosql/spi/type/NamedTypeSignature.java @@ -65,7 +65,7 @@ public boolean equals(Object o) public String toString() { if (fieldName.isPresent()) { - return format("%s %s", fieldName.get(), typeSignature); + return format("\"%s\" %s", fieldName.get().getName().replace("\"", "\"\""), typeSignature); } return typeSignature.toString(); } diff --git a/presto-spi/src/main/java/io/prestosql/spi/type/RowFieldName.java b/presto-spi/src/main/java/io/prestosql/spi/type/RowFieldName.java index b8f83f653d60c..f7852030485d8 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/type/RowFieldName.java +++ b/presto-spi/src/main/java/io/prestosql/spi/type/RowFieldName.java @@ -20,12 +20,10 @@ public class RowFieldName { private final String name; - private final boolean delimited; - public RowFieldName(String name, boolean delimited) + public RowFieldName(String name) { this.name = requireNonNull(name, "name is null"); - this.delimited = delimited; } public String getName() @@ -33,12 +31,6 @@ public String getName() return name; } - @Deprecated - public boolean isDelimited() - { - return delimited; - } - @Override public boolean equals(Object o) { @@ -51,22 +43,18 @@ public boolean equals(Object o) RowFieldName other = (RowFieldName) o; - return Objects.equals(this.name, other.name) && - Objects.equals(this.delimited, other.delimited); + return Objects.equals(this.name, other.name); } @Override public String toString() { - if (!isDelimited()) { - return name; - } return '"' + name.replace("\"", "\"\"") + '"'; } @Override public int hashCode() { - return Objects.hash(name, delimited); + return Objects.hash(name); } } diff --git a/presto-spi/src/main/java/io/prestosql/spi/type/RowType.java b/presto-spi/src/main/java/io/prestosql/spi/type/RowType.java index 8ee5eaa4c2434..e3cd680e7c0a7 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/type/RowType.java +++ b/presto-spi/src/main/java/io/prestosql/spi/type/RowType.java @@ -98,7 +98,7 @@ private static TypeSignature makeSignature(List fields) } List parameters = fields.stream() - .map(field -> TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(field.getName().map(name -> new RowFieldName(name, false)), field.getType().getTypeSignature()))) + .map(field -> TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(field.getName().map(name -> new RowFieldName(name)), field.getType().getTypeSignature()))) .collect(Collectors.toList()); return new TypeSignature(ROW, parameters); diff --git a/presto-spi/src/main/java/io/prestosql/spi/type/TypeSignatureParameter.java b/presto-spi/src/main/java/io/prestosql/spi/type/TypeSignatureParameter.java index 597822d4cded3..3bc0db3e69ae8 100644 --- a/presto-spi/src/main/java/io/prestosql/spi/type/TypeSignatureParameter.java +++ b/presto-spi/src/main/java/io/prestosql/spi/type/TypeSignatureParameter.java @@ -41,7 +41,7 @@ public static TypeSignatureParameter namedTypeParameter(NamedTypeSignature named public static TypeSignatureParameter namedField(String name, TypeSignature type) { - return new TypeSignatureParameter(ParameterKind.NAMED_TYPE, new NamedTypeSignature(Optional.of(new RowFieldName(name, false)), type)); + return new TypeSignatureParameter(ParameterKind.NAMED_TYPE, new NamedTypeSignature(Optional.of(new RowFieldName(name)), type)); } public static TypeSignatureParameter anonymousField(TypeSignature type) diff --git a/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java b/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java index 6ec44068cdefd..fee79cda593c9 100644 --- a/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java +++ b/presto-tests/src/test/java/io/prestosql/tests/TestTpchDistributedQueries.java @@ -155,6 +155,16 @@ public void testRowSubscriptWithReservedKeyword() "VALUES 1"); } + @Test + public void testRowTypeWithReservedKeyword() + { + // This test is here because it only reproduces the issue (https://github.com/prestosql/presto/issues/1962) + // when running in distributed mode + assertQuery( + "SELECT cast(row(1) AS row(\"cross\" bigint)).\"cross\"", + "VALUES 1"); + } + private Session createSession(String schemaName) { return testSessionBuilder()