Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@

import static com.facebook.presto.common.type.VarcharType.VARCHAR;
import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.GenericTable.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.GenericTableReturnTypeSpecification.GENERIC_TABLE;
import static java.util.Objects.requireNonNull;

public class QueryFunctionProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
import com.facebook.presto.spi.function.SchemaFunctionName;
import com.facebook.presto.spi.function.table.ArgumentSpecification;
import com.facebook.presto.spi.function.table.ConnectorTableFunction;
import com.facebook.presto.spi.function.table.ReturnTypeSpecification.DescribedTable;
import com.facebook.presto.spi.function.table.DescribedTableReturnTypeSpecification;
import com.facebook.presto.spi.function.table.TableArgumentSpecification;
import com.facebook.presto.spi.function.table.TableFunctionMetadata;
import com.facebook.presto.sql.analyzer.SemanticException;
import com.facebook.presto.sql.tree.QualifiedName;
import com.google.common.collect.ImmutableList;
Expand Down Expand Up @@ -157,8 +158,8 @@ private static void validateTableFunction(ConnectorTableFunction tableFunction)
// Such a table argument is implicitly 'prune when empty'. The TableArgumentSpecification.Builder enforces the 'prune when empty' property
// for a table argument with row semantics.

if (tableFunction.getReturnTypeSpecification() instanceof DescribedTable) {
DescribedTable describedTable = (DescribedTable) tableFunction.getReturnTypeSpecification();
if (tableFunction.getReturnTypeSpecification() instanceof DescribedTableReturnTypeSpecification) {
DescribedTableReturnTypeSpecification describedTable = (DescribedTableReturnTypeSpecification) tableFunction.getReturnTypeSpecification();
checkArgument(describedTable.getDescriptor().isTyped(), "field types missing in returned type specification");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import static com.facebook.presto.spi.StandardErrorCode.INVALID_ARGUMENTS;
import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT;
import static com.facebook.presto.spi.function.table.DescriptorArgument.NULL_DESCRIPTOR;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.GenericTable.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.GenericTableReturnTypeSpecification.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.TableFunctionProcessorState.Finished.FINISHED;
import static com.facebook.presto.spi.function.table.TableFunctionProcessorState.Processed.usedInputAndProduced;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import com.facebook.presto.spi.function.table.Argument;
import com.facebook.presto.spi.function.table.ConnectorTableFunction;
import com.facebook.presto.spi.function.table.ConnectorTableFunctionHandle;
import com.facebook.presto.spi.function.table.ReturnTypeSpecification.DescribedTable;
import com.facebook.presto.spi.function.table.DescribedTableReturnTypeSpecification;
import com.facebook.presto.spi.function.table.ScalarArgument;
import com.facebook.presto.spi.function.table.ScalarArgumentSpecification;
import com.facebook.presto.spi.function.table.TableFunctionAnalysis;
Expand Down Expand Up @@ -96,7 +96,7 @@ public SequenceFunction()
.type(BIGINT)
.defaultValue(1L)
.build()),
new DescribedTable(descriptor(ImmutableList.of("sequential_number"), ImmutableList.of(BIGINT))));
new DescribedTableReturnTypeSpecification(descriptor(ImmutableList.of("sequential_number"), ImmutableList.of(BIGINT))));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.Metadata;
import com.facebook.presto.metadata.OperatorNotFoundException;
import com.facebook.presto.metadata.TableFunctionMetadata;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.ColumnMetadata;
import com.facebook.presto.spi.ConnectorId;
Expand All @@ -62,6 +61,7 @@
import com.facebook.presto.spi.function.table.Argument;
import com.facebook.presto.spi.function.table.ArgumentSpecification;
import com.facebook.presto.spi.function.table.ConnectorTableFunction;
import com.facebook.presto.spi.function.table.DescribedTableReturnTypeSpecification;
import com.facebook.presto.spi.function.table.Descriptor;
import com.facebook.presto.spi.function.table.DescriptorArgument;
import com.facebook.presto.spi.function.table.DescriptorArgumentSpecification;
Expand All @@ -71,6 +71,7 @@
import com.facebook.presto.spi.function.table.TableArgument;
import com.facebook.presto.spi.function.table.TableArgumentSpecification;
import com.facebook.presto.spi.function.table.TableFunctionAnalysis;
import com.facebook.presto.spi.function.table.TableFunctionMetadata;
import com.facebook.presto.spi.procedure.DistributedProcedure;
import com.facebook.presto.spi.procedure.TableDataRewriteDistributedProcedure;
import com.facebook.presto.spi.relation.DomainTranslator;
Expand Down Expand Up @@ -268,7 +269,7 @@
import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE;
import static com.facebook.presto.spi.function.FunctionKind.WINDOW;
import static com.facebook.presto.spi.function.table.DescriptorArgument.NULL_DESCRIPTOR;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.GenericTable.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.GenericTableReturnTypeSpecification.GENERIC_TABLE;
import static com.facebook.presto.spi.security.ViewSecurity.DEFINER;
import static com.facebook.presto.spi.security.ViewSecurity.INVOKER;
import static com.facebook.presto.sql.MaterializedViewUtils.buildOwnerSession;
Expand Down Expand Up @@ -1666,7 +1667,7 @@ private void verifyRequiredColumns(TableFunctionInvocation node, Map<String, Lis
private Descriptor verifyProperColumnsDescriptor(TableFunctionInvocation node, ConnectorTableFunction function, ReturnTypeSpecification returnTypeSpecification, Optional<Descriptor> analyzedProperColumnsDescriptor)
{
switch (returnTypeSpecification.getReturnType()) {
case ReturnTypeSpecification.OnlyPassThrough.returnType:
case "PASSTHROUGH":
if (analysis.isAliased(node)) {
// According to SQL standard ISO/IEC 9075-2, 7.6 <table reference>, p. 409,
// table alias is prohibited for a table function with ONLY PASS THROUGH returned type.
Expand All @@ -1688,7 +1689,7 @@ private Descriptor verifyProperColumnsDescriptor(TableFunctionInvocation node, C
throw new SemanticException(TABLE_FUNCTION_IMPLEMENTATION_ERROR, "A table function with ONLY_PASS_THROUGH return type must have a table argument with pass-through columns.");
}
return null;
case ReturnTypeSpecification.GenericTable.returnType:
case "GENERIC":
// According to SQL standard ISO/IEC 9075-2, 7.6 <table reference>, p. 409,
// table alias is mandatory for a polymorphic table function invocation which produces proper columns.
// We don't enforce this requirement.
Expand All @@ -1704,7 +1705,7 @@ private Descriptor verifyProperColumnsDescriptor(TableFunctionInvocation node, C
// so the function's analyze() method should not return the proper columns descriptor.
throw new SemanticException(TABLE_FUNCTION_AMBIGUOUS_RETURN_TYPE, node, "Returned relation type for table function %s is ambiguous", node.getName());
}
return ((ReturnTypeSpecification.DescribedTable) returnTypeSpecification).getDescriptor();
return ((DescribedTableReturnTypeSpecification) returnTypeSpecification).getDescriptor();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@
import com.facebook.presto.spi.function.table.AbstractConnectorTableFunction;
import com.facebook.presto.spi.function.table.Argument;
import com.facebook.presto.spi.function.table.ConnectorTableFunctionHandle;
import com.facebook.presto.spi.function.table.DescribedTableReturnTypeSpecification;
import com.facebook.presto.spi.function.table.Descriptor;
import com.facebook.presto.spi.function.table.DescriptorArgumentSpecification;
import com.facebook.presto.spi.function.table.ReturnTypeSpecification;
import com.facebook.presto.spi.function.table.GenericTableReturnTypeSpecification;
import com.facebook.presto.spi.function.table.ScalarArgument;
import com.facebook.presto.spi.function.table.ScalarArgumentSpecification;
import com.facebook.presto.spi.function.table.TableArgument;
Expand Down Expand Up @@ -63,9 +64,8 @@
import static com.facebook.presto.common.type.BooleanType.BOOLEAN;
import static com.facebook.presto.common.type.IntegerType.INTEGER;
import static com.facebook.presto.common.type.VarcharType.VARCHAR;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.DescribedTable;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.GenericTable.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.ReturnTypeSpecification.OnlyPassThrough.ONLY_PASS_THROUGH;
import static com.facebook.presto.spi.function.table.GenericTableReturnTypeSpecification.GENERIC_TABLE;
import static com.facebook.presto.spi.function.table.OnlyPassThroughReturnTypeSpecification.ONLY_PASS_THROUGH;
import static com.facebook.presto.spi.function.table.TableFunctionProcessorState.Finished.FINISHED;
import static com.facebook.presto.spi.function.table.TableFunctionProcessorState.Processed.produced;
import static com.facebook.presto.spi.function.table.TableFunctionProcessorState.Processed.usedInput;
Expand Down Expand Up @@ -99,7 +99,7 @@ public static class TestConnectorTableFunction
private static final String FUNCTION_NAME = "test_function";
public TestConnectorTableFunction()
{
super(SCHEMA_NAME, FUNCTION_NAME, ImmutableList.of(), ReturnTypeSpecification.GenericTable.GENERIC_TABLE);
super(SCHEMA_NAME, FUNCTION_NAME, ImmutableList.of(), GenericTableReturnTypeSpecification.GENERIC_TABLE);
}

@Override
Expand Down Expand Up @@ -473,7 +473,7 @@ public MonomorphicStaticReturnTypeFunction()
SCHEMA_NAME,
FUNCTION_NAME,
ImmutableList.of(),
new DescribedTable(Descriptor.descriptor(
new DescribedTableReturnTypeSpecification(Descriptor.descriptor(
ImmutableList.of("a", "b"),
ImmutableList.of(BOOLEAN, INTEGER))));
}
Expand All @@ -499,7 +499,7 @@ public PolymorphicStaticReturnTypeFunction()
ImmutableList.of(TableArgumentSpecification.builder()
.name("INPUT")
.build()),
new DescribedTable(Descriptor.descriptor(
new DescribedTableReturnTypeSpecification(Descriptor.descriptor(
ImmutableList.of("a", "b"),
ImmutableList.of(BOOLEAN, INTEGER))));
}
Expand All @@ -525,7 +525,7 @@ public PassThroughFunction()
.passThroughColumns()
.keepWhenEmpty()
.build()),
new DescribedTable(Descriptor.descriptor(
new DescribedTableReturnTypeSpecification(Descriptor.descriptor(
ImmutableList.of("x"),
ImmutableList.of(BOOLEAN))));
}
Expand Down Expand Up @@ -858,7 +858,7 @@ public EmptyOutputFunction()
.name("INPUT")
.keepWhenEmpty()
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
}

@Override
Expand Down Expand Up @@ -911,7 +911,7 @@ public EmptyOutputWithPassThroughFunction()
.keepWhenEmpty()
.passThroughColumns()
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
}

@Override
Expand Down Expand Up @@ -979,7 +979,7 @@ public TestInputsFunction()
.name("INPUT_4")
.keepWhenEmpty()
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("boolean_result", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("boolean_result", Optional.of(BOOLEAN))))));
}

@Override
Expand Down Expand Up @@ -1035,7 +1035,7 @@ public PassThroughInputFunction()
.passThroughColumns()
.keepWhenEmpty()
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(
new Descriptor.Field("input_1_present", Optional.of(BOOLEAN)),
new Descriptor.Field("input_2_present", Optional.of(BOOLEAN))))));
}
Expand Down Expand Up @@ -1132,7 +1132,7 @@ public TestInputFunction()
.name("INPUT")
.keepWhenEmpty()
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("got_input", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("got_input", Optional.of(BOOLEAN))))));
}

@Override
Expand Down Expand Up @@ -1191,7 +1191,7 @@ public TestSingleInputRowSemanticsFunction()
.rowSemantics()
.name("INPUT")
.build()),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("boolean_result", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("boolean_result", Optional.of(BOOLEAN))))));
}

@Override
Expand Down Expand Up @@ -1242,7 +1242,7 @@ public ConstantFunction()
.type(INTEGER)
.defaultValue(1L)
.build()),
new DescribedTable(Descriptor.descriptor(
new DescribedTableReturnTypeSpecification(Descriptor.descriptor(
ImmutableList.of("constant_column"),
ImmutableList.of(INTEGER))));
}
Expand Down Expand Up @@ -1438,7 +1438,7 @@ public EmptySourceFunction()
SCHEMA_NAME,
FUNCTION_NAME,
ImmutableList.of(),
new DescribedTable(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
new DescribedTableReturnTypeSpecification(new Descriptor(ImmutableList.of(new Descriptor.Field("column", Optional.of(BOOLEAN))))));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import com.facebook.presto.Session;
import com.facebook.presto.spi.ConnectorId;
import com.facebook.presto.spi.function.table.TableFunctionMetadata;
import com.facebook.presto.spi.security.Identity;
import com.facebook.presto.sql.tree.QualifiedName;
import com.google.common.collect.ImmutableList;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

import com.facebook.presto.spi.ConnectorSession;
import com.facebook.presto.spi.connector.ConnectorTransactionHandle;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -44,32 +46,41 @@ public abstract class AbstractConnectorTableFunction
private final List<ArgumentSpecification> arguments;
private final ReturnTypeSpecification returnTypeSpecification;

public AbstractConnectorTableFunction(String schema, String name, List<ArgumentSpecification> arguments, ReturnTypeSpecification returnTypeSpecification)
@JsonCreator
public AbstractConnectorTableFunction(
@JsonProperty("schema") String schema,
@JsonProperty("name") String name,
@JsonProperty("arguments") List<ArgumentSpecification> arguments,
@JsonProperty("returnTypeSpecification") ReturnTypeSpecification returnTypeSpecification)
{
this.schema = requireNonNull(schema, "schema is null");
this.name = requireNonNull(name, "name is null");
this.arguments = Collections.unmodifiableList(new ArrayList<>(requireNonNull(arguments, "arguments is null")));
this.returnTypeSpecification = requireNonNull(returnTypeSpecification, "returnTypeSpecification is null");
}

@JsonProperty
@Override
public String getSchema()
{
return schema;
}

@JsonProperty
@Override
public String getName()
{
return name;
}

@JsonProperty
@Override
public List<ArgumentSpecification> getArguments()
{
return arguments;
}

@JsonProperty
@Override
public ReturnTypeSpecification getReturnTypeSpecification()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
*/
package com.facebook.presto.spi.function.table;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import jakarta.annotation.Nullable;

import static com.facebook.presto.spi.function.table.Preconditions.checkArgument;
Expand All @@ -28,6 +31,14 @@
* <p>
* Default values are allowed for all arguments except Table arguments.
*/
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "@type")
@JsonSubTypes({
@JsonSubTypes.Type(value = DescriptorArgumentSpecification.class, name = "descriptor"),
@JsonSubTypes.Type(value = TableArgumentSpecification.class, name = "table"),
@JsonSubTypes.Type(value = ScalarArgumentSpecification.class, name = "scalar")})
public abstract class ArgumentSpecification
{
public static final String argumentType = "Abstract";
Expand All @@ -45,16 +56,19 @@ public abstract class ArgumentSpecification
this.defaultValue = defaultValue;
}

@JsonProperty
public String getName()
{
return name;
}

@JsonProperty
public boolean isRequired()
{
return required;
}

@JsonProperty
public Object getDefaultValue()
{
return defaultValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
*/
package com.facebook.presto.spi.function.table;

import com.facebook.presto.spi.ConnectorSession;
import com.facebook.presto.spi.ConnectorSplitSource;
import com.facebook.presto.spi.NodeManager;
import com.facebook.presto.spi.connector.ConnectorTransactionHandle;
import com.fasterxml.jackson.annotation.JsonInclude;

/**
Expand All @@ -21,4 +25,11 @@
@JsonInclude(JsonInclude.Include.ALWAYS)
public interface ConnectorTableFunctionHandle
{
default ConnectorSplitSource getSplits(ConnectorTransactionHandle transaction,
ConnectorSession session,
NodeManager nodeManager,
Object functionAndTypeManager)
{
throw new UnsupportedOperationException();
}
}
Loading
Loading