From 4e20c1ccf90d6b27fd64964d0dc951841df879ce Mon Sep 17 00:00:00 2001 From: Pratik Joseph Dabre Date: Wed, 5 Feb 2025 10:55:33 -0800 Subject: [PATCH] Add a new ErrorCode UNKNOWN_TYPE --- .../facebook/presto/execution/AddColumnTask.java | 9 +++++++-- .../BuiltInTypeAndFunctionNamespaceManager.java | 3 ++- .../facebook/presto/metadata/SignatureBinder.java | 12 +++++++++++- .../presto/sql/analyzer/ExpressionAnalyzer.java | 7 +++++++ .../presto/sql/analyzer/ExpressionTreeUtils.java | 9 +++++++-- .../presto/type/TestBuiltInTypeRegistry.java | 14 ++++++++++---- .../com/facebook/presto/spi/StandardErrorCode.java | 1 + 7 files changed, 45 insertions(+), 10 deletions(-) diff --git a/presto-main/src/main/java/com/facebook/presto/execution/AddColumnTask.java b/presto-main/src/main/java/com/facebook/presto/execution/AddColumnTask.java index 8a5fd2cff46b3..625e83fc2b911 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/AddColumnTask.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/AddColumnTask.java @@ -21,6 +21,7 @@ import com.facebook.presto.spi.ColumnMetadata; import com.facebook.presto.spi.ConnectorId; import com.facebook.presto.spi.MaterializedViewDefinition; +import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.TableHandle; import com.facebook.presto.spi.WarningCollector; import com.facebook.presto.spi.security.AccessControl; @@ -39,6 +40,7 @@ import static com.facebook.presto.common.type.UnknownType.UNKNOWN; import static com.facebook.presto.metadata.MetadataUtil.createQualifiedObjectName; import static com.facebook.presto.metadata.MetadataUtil.getConnectorIdOrThrow; +import static com.facebook.presto.spi.StandardErrorCode.UNKNOWN_TYPE; import static com.facebook.presto.spi.connector.ConnectorCapabilities.NOT_NULL_COLUMN_CONSTRAINT; import static com.facebook.presto.sql.NodeUtils.mapFromProperties; import static com.facebook.presto.sql.analyzer.SemanticErrorCode.COLUMN_ALREADY_EXISTS; @@ -88,8 +90,11 @@ public ListenableFuture execute(AddColumn statement, TransactionManager trans try { type = metadata.getType(parseTypeSignature(element.getType())); } - catch (IllegalArgumentException e) { - throw new SemanticException(TYPE_MISMATCH, element, "Unknown type '%s' for column '%s'", element.getType(), element.getName()); + catch (PrestoException e) { + if (e.getErrorCode() == UNKNOWN_TYPE.toErrorCode()) { + throw new SemanticException(TYPE_MISMATCH, element, "Unknown type '%s' for column '%s'", element.getType(), element.getName()); + } + throw e; } if (type.equals(UNKNOWN)) { throw new SemanticException(TYPE_MISMATCH, element, "Unknown type '%s' for column '%s'", element.getType(), element.getName()); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java index c419822e91405..2578e103e4821 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInTypeAndFunctionNamespaceManager.java @@ -453,6 +453,7 @@ import static com.facebook.presto.operator.window.AggregateWindowFunction.supplier; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_MISSING; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_USER_ERROR; +import static com.facebook.presto.spi.StandardErrorCode.UNKNOWN_TYPE; import static com.facebook.presto.spi.function.FunctionImplementationType.JAVA; import static com.facebook.presto.spi.function.FunctionImplementationType.SQL; import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; @@ -1312,7 +1313,7 @@ private Type instantiateParametricType(ExactTypeSignature exactSignature) ParametricType parametricType = parametricTypes.get(signature.getBase().toLowerCase(Locale.ENGLISH)); if (parametricType == null) { - throw new IllegalArgumentException("Unknown type " + signature); + throw new PrestoException(UNKNOWN_TYPE, "Unknown type " + signature); } if (parametricType instanceof MapParametricType) { diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java index 42fdb77c3bdb5..765377c256752 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SignatureBinder.java @@ -21,6 +21,7 @@ import com.facebook.presto.common.type.TypeSignature; import com.facebook.presto.common.type.TypeSignatureParameter; import com.facebook.presto.common.type.TypeWithName; +import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.LongVariableConstraint; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.TypeVariableConstraint; @@ -39,6 +40,7 @@ import java.util.Set; import static com.facebook.presto.common.type.UnknownType.UNKNOWN; +import static com.facebook.presto.spi.StandardErrorCode.UNKNOWN_TYPE; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; import static com.facebook.presto.type.TypeCalculation.calculateLiteralValue; import static com.google.common.base.Preconditions.checkArgument; @@ -532,7 +534,15 @@ private static List expandVarargFormalTypeSignature(List context) catch (IllegalArgumentException e) { throw new SemanticException(TYPE_MISMATCH, node, "Unknown type: " + node.getType()); } + catch (PrestoException e) { + if (e.getErrorCode() == UNKNOWN_TYPE.toErrorCode()) { + throw new SemanticException(TYPE_MISMATCH, node, "Unknown type: " + node.getType()); + } + throw e; + } if (type.equals(UNKNOWN)) { throw new SemanticException(TYPE_MISMATCH, node, "UNKNOWN is not a valid type"); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionTreeUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionTreeUtils.java index c1c5b6765e34c..a54b8b0af8b73 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionTreeUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionTreeUtils.java @@ -16,6 +16,7 @@ import com.facebook.presto.common.type.EnumType; import com.facebook.presto.common.type.Type; import com.facebook.presto.common.type.TypeWithName; +import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.SourceLocation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.relation.VariableReferenceExpression; @@ -43,6 +44,7 @@ import java.util.function.Predicate; import static com.facebook.presto.common.type.TypeSignature.parseTypeSignature; +import static com.facebook.presto.spi.StandardErrorCode.UNKNOWN_TYPE; import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -152,8 +154,11 @@ public static Optional tryResolveEnumLiteralType(QualifiedName qua return Optional.of((TypeWithName) baseType); } } - catch (IllegalArgumentException e) { - return Optional.empty(); + catch (PrestoException e) { + if (e.getErrorCode() == UNKNOWN_TYPE.toErrorCode()) { + return Optional.empty(); + } + throw e; } return Optional.empty(); } diff --git a/presto-main/src/test/java/com/facebook/presto/type/TestBuiltInTypeRegistry.java b/presto-main/src/test/java/com/facebook/presto/type/TestBuiltInTypeRegistry.java index a4f14a3b74095..8b629edd4f235 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/TestBuiltInTypeRegistry.java +++ b/presto-main/src/test/java/com/facebook/presto/type/TestBuiltInTypeRegistry.java @@ -17,6 +17,7 @@ import com.facebook.presto.common.type.TypeSignature; import com.facebook.presto.metadata.FunctionAndTypeManager; import com.facebook.presto.metadata.OperatorNotFoundException; +import com.facebook.presto.spi.PrestoException; import com.google.common.collect.ImmutableSet; import org.testng.annotations.Test; @@ -52,6 +53,7 @@ import static com.facebook.presto.common.type.VarcharType.createVarcharType; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.metadata.FunctionAndTypeManager.createTestFunctionAndTypeManager; +import static com.facebook.presto.spi.StandardErrorCode.UNKNOWN_TYPE; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; import static com.facebook.presto.type.JoniRegexpType.JONI_REGEXP; import static com.facebook.presto.type.JsonPathType.JSON_PATH; @@ -73,13 +75,17 @@ public void testNonexistentType() { try { functionAndTypeManager.getType(parseTypeSignature("not a real type")); - fail("Expect to throw IllegalArgumentException"); + fail("Expect to throw PrestoException"); } - catch (IllegalArgumentException e) { - assertTrue(e.getMessage().matches("Unknown type.*")); + catch (PrestoException e) { + if (e.getErrorCode() == UNKNOWN_TYPE.toErrorCode()) { + assertTrue(e.getMessage().matches("Unknown type.*")); + return; + } + throw e; } catch (Throwable t) { - fail("Expect to throw IllegalArgumentException, got " + t.getClass()); + fail("Expect to throw PrestoException, got " + t.getClass()); } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/StandardErrorCode.java b/presto-spi/src/main/java/com/facebook/presto/spi/StandardErrorCode.java index 09aa55cb24111..2c9175b74fff2 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/StandardErrorCode.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/StandardErrorCode.java @@ -73,6 +73,7 @@ public enum StandardErrorCode INVALID_TYPE_DEFINITION(0x0000_002F, USER_ERROR), VIEW_NOT_FOUND(0x0000_0030, USER_ERROR), INVALID_LIMIT_CLAUSE(0x0000_0031, USER_ERROR), + UNKNOWN_TYPE(0x0000_0032, USER_ERROR), GENERIC_INTERNAL_ERROR(0x0001_0000, INTERNAL_ERROR), TOO_MANY_REQUESTS_FAILED(0x0001_0001, INTERNAL_ERROR, true),