Skip to content

Commit 4c543a0

Browse files
mohsakapdabre12kasiafixin-zhang2
committed
Analyze table function invocation
Changes adapted from trino/PR#11336, 12910 Original commits: 9e8d51ad45f57267f5f7fa6bf8e8c4ec56103dda f0508a7ab420449c6e2960ecf1d0a8d7058242da Author: kasiafi Modifications were made to adapt to Presto including: Removal of Node Location from TrinoException Added new SemanticErrorCodes Changed Void context to SqlPlannerContext in RelationPlanner.java Add newUnqualified to Field class with Presto specification Add getCanonicalValue to Identifier.java Co-authored-by: Pratik Joseph Dabre <[email protected]> Co-authored-by: kasiafi <[email protected]> Co-authored-by: Xin Zhang <[email protected]>
1 parent b6c6cbf commit 4c543a0

File tree

20 files changed

+1063
-193
lines changed

20 files changed

+1063
-193
lines changed

presto-analyzer/src/main/java/com/facebook/presto/sql/analyzer/Analysis.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919
import com.facebook.presto.common.type.Type;
2020
import com.facebook.presto.spi.ColumnHandle;
2121
import com.facebook.presto.spi.ColumnMetadata;
22+
import com.facebook.presto.spi.ConnectorId;
2223
import com.facebook.presto.spi.TableHandle;
2324
import com.facebook.presto.spi.analyzer.AccessControlInfo;
2425
import com.facebook.presto.spi.analyzer.AccessControlInfoForTable;
2526
import com.facebook.presto.spi.analyzer.AccessControlReferences;
2627
import com.facebook.presto.spi.analyzer.AccessControlRole;
28+
import com.facebook.presto.spi.connector.ConnectorTransactionHandle;
2729
import com.facebook.presto.spi.function.FunctionHandle;
2830
import com.facebook.presto.spi.function.FunctionKind;
31+
import com.facebook.presto.spi.function.table.Argument;
32+
import com.facebook.presto.spi.function.table.ConnectorTableFunctionHandle;
2933
import com.facebook.presto.spi.security.AccessControl;
3034
import com.facebook.presto.spi.security.AccessControlContext;
3135
import com.facebook.presto.spi.security.AllowAllAccessControl;
@@ -51,6 +55,7 @@
5155
import com.facebook.presto.sql.tree.Statement;
5256
import com.facebook.presto.sql.tree.SubqueryExpression;
5357
import com.facebook.presto.sql.tree.Table;
58+
import com.facebook.presto.sql.tree.TableFunctionInvocation;
5459
import com.google.common.collect.ArrayListMultimap;
5560
import com.google.common.collect.HashMultiset;
5661
import com.google.common.collect.ImmutableList;
@@ -199,6 +204,8 @@ public class Analysis
199204
// Keeps track of the subquery we are visiting, so we have access to base query information when processing materialized view status
200205
private Optional<QuerySpecification> currentQuerySpecification = Optional.empty();
201206

207+
private final Map<NodeRef<TableFunctionInvocation>, TableFunctionInvocationAnalysis> tableFunctionAnalyses = new LinkedHashMap<>();
208+
202209
public Analysis(@Nullable Statement root, Map<NodeRef<Parameter>, Expression> parameters, boolean isDescribe)
203210
{
204211
this.root = root;
@@ -1061,6 +1068,16 @@ public Map<String, Expression> getColumnMasks(Table table)
10611068
return columnMasks.getOrDefault(NodeRef.of(table), ImmutableMap.of());
10621069
}
10631070

1071+
public void setTableFunctionAnalysis(TableFunctionInvocation node, TableFunctionInvocationAnalysis analysis)
1072+
{
1073+
tableFunctionAnalyses.put(NodeRef.of(node), analysis);
1074+
}
1075+
1076+
public TableFunctionInvocationAnalysis getTableFunctionAnalysis(TableFunctionInvocation node)
1077+
{
1078+
return tableFunctionAnalyses.get(NodeRef.of(node));
1079+
}
1080+
10641081
@Immutable
10651082
public static final class Insert
10661083
{
@@ -1311,4 +1328,57 @@ public int hashCode()
13111328
return Objects.hash(table, column, identity);
13121329
}
13131330
}
1331+
1332+
/**
1333+
* Encapsulates the result of analyzing a table function invocation.
1334+
* Includes the connector ID, function name, argument bindings, and the
1335+
* connector-specific table function handle needed for planning and execution.
1336+
*/
1337+
public static class TableFunctionInvocationAnalysis
1338+
{
1339+
private final ConnectorId connectorId;
1340+
private final String functionName;
1341+
private final Map<String, Argument> arguments;
1342+
private final ConnectorTableFunctionHandle connectorTableFunctionHandle;
1343+
private final ConnectorTransactionHandle transactionHandle;
1344+
1345+
public TableFunctionInvocationAnalysis(
1346+
ConnectorId connectorId,
1347+
String functionName,
1348+
Map<String, Argument> arguments,
1349+
ConnectorTableFunctionHandle connectorTableFunctionHandle,
1350+
ConnectorTransactionHandle transactionHandle)
1351+
{
1352+
this.connectorId = requireNonNull(connectorId, "connectorId is null");
1353+
this.functionName = requireNonNull(functionName, "functionName is null");
1354+
this.arguments = ImmutableMap.copyOf(arguments);
1355+
this.connectorTableFunctionHandle = requireNonNull(connectorTableFunctionHandle, "connectorTableFunctionHandle is null");
1356+
this.transactionHandle = requireNonNull(transactionHandle, "transactionHandle is null");
1357+
}
1358+
1359+
public ConnectorId getConnectorId()
1360+
{
1361+
return connectorId;
1362+
}
1363+
1364+
public String getFunctionName()
1365+
{
1366+
return functionName;
1367+
}
1368+
1369+
public Map<String, Argument> getArguments()
1370+
{
1371+
return arguments;
1372+
}
1373+
1374+
public ConnectorTableFunctionHandle getConnectorTableFunctionHandle()
1375+
{
1376+
return connectorTableFunctionHandle;
1377+
}
1378+
1379+
public ConnectorTransactionHandle getTransactionHandle()
1380+
{
1381+
return transactionHandle;
1382+
}
1383+
}
13141384
}

presto-analyzer/src/main/java/com/facebook/presto/sql/analyzer/Field.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ public Field(Optional<NodeLocation> nodeLocation, Optional<QualifiedName> relati
8686
this.aliased = aliased;
8787
}
8888

89+
public static Field newUnqualified(Optional<String> name, Type type)
90+
{
91+
requireNonNull(name, "name is null");
92+
requireNonNull(type, "type is null");
93+
94+
return new Field(Optional.empty(), Optional.empty(), name, type, false, Optional.empty(), Optional.empty(), false);
95+
}
96+
8997
public Optional<NodeLocation> getNodeLocation()
9098
{
9199
return nodeLocation;

presto-analyzer/src/main/java/com/facebook/presto/sql/analyzer/SemanticErrorCode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ public enum SemanticErrorCode
5858
DUPLICATE_PARAMETER_NAME,
5959
EXCEPTIONS_WHEN_RESOLVING_FUNCTIONS,
6060

61+
MISSING_RETURN_TYPE,
62+
AMBIGUOUS_RETURN_TYPE,
63+
MISSING_ARGUMENT,
64+
INVALID_FUNCTION_ARGUMENT,
65+
INVALID_ARGUMENTS,
66+
NOT_IMPLEMENTED,
67+
6168
ORDER_BY_MUST_BE_IN_SELECT,
6269
ORDER_BY_MUST_BE_IN_AGGREGATE,
6370
REFERENCE_TO_OUTPUT_ATTRIBUTE_WITHIN_ORDER_BY_GROUPING,

presto-main-base/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,11 @@ public void addTypeManagerFactory(TypeManagerFactory factory)
476476
}
477477
}
478478

479+
public TransactionManager getTransactionManager()
480+
{
481+
return transactionManager;
482+
}
483+
479484
public void registerBuiltInFunctions(List<? extends SqlFunction> functions)
480485
{
481486
builtInTypeAndFunctionNamespaceManager.registerBuiltInFunctions(functions);

0 commit comments

Comments
 (0)