4848import com .facebook .presto .spi .function .FunctionKind ;
4949import com .facebook .presto .spi .function .Signature ;
5050import com .facebook .presto .spi .function .SqlFunction ;
51+ import com .facebook .presto .spi .procedure .DistributedProcedure ;
5152import com .facebook .presto .spi .relation .DomainTranslator ;
5253import com .facebook .presto .spi .relation .RowExpression ;
5354import com .facebook .presto .spi .security .AccessControl ;
198199import static com .facebook .presto .common .type .TypeSignature .parseTypeSignature ;
199200import static com .facebook .presto .common .type .UnknownType .UNKNOWN ;
200201import static com .facebook .presto .common .type .VarcharType .VARCHAR ;
202+ import static com .facebook .presto .execution .CallTask .extractParameterValuesInOrder ;
201203import static com .facebook .presto .metadata .MetadataUtil .createQualifiedObjectName ;
202204import static com .facebook .presto .metadata .MetadataUtil .toSchemaTableName ;
203205import static com .facebook .presto .spi .StandardErrorCode .INVALID_ARGUMENTS ;
249251import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISMATCHED_COLUMN_ALIASES ;
250252import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISMATCHED_SET_COLUMN_TYPES ;
251253import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISSING_ATTRIBUTE ;
254+ import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISSING_CATALOG ;
252255import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISSING_COLUMN ;
253256import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISSING_MATERIALIZED_VIEW ;
254257import static com .facebook .presto .sql .analyzer .SemanticErrorCode .MISSING_SCHEMA ;
@@ -341,7 +344,7 @@ public Scope analyze(Node node, Scope outerQueryScope)
341344
342345 public Scope analyze (Node node , Optional <Scope > outerQueryScope )
343346 {
344- return new Visitor (outerQueryScope , warningCollector ).process (node , Optional .empty ());
347+ return new Visitor (metadata , session , outerQueryScope , warningCollector ).process (node , Optional .empty ());
345348 }
346349
347350 /**
@@ -352,11 +355,19 @@ public Scope analyze(Node node, Optional<Scope> outerQueryScope)
352355 private class Visitor
353356 extends DefaultTraversalVisitor <Scope , Optional <Scope >>
354357 {
358+ private final Metadata metadata ;
359+ private final Session session ;
355360 private final Optional <Scope > outerQueryScope ;
356361 private final WarningCollector warningCollector ;
357362
358- private Visitor (Optional <Scope > outerQueryScope , WarningCollector warningCollector )
363+ private Visitor (
364+ Metadata metadata ,
365+ Session session ,
366+ Optional <Scope > outerQueryScope ,
367+ WarningCollector warningCollector )
359368 {
369+ this .metadata = requireNonNull (metadata , "metadata is null" );
370+ this .session = requireNonNull (session , "session is null" );
360371 this .outerQueryScope = requireNonNull (outerQueryScope , "outerQueryScope is null" );
361372 this .warningCollector = requireNonNull (warningCollector , "warningCollector is null" );
362373 }
@@ -1056,9 +1067,47 @@ protected Scope visitRevoke(Revoke node, Optional<Scope> scope)
10561067 }
10571068
10581069 @ Override
1059- protected Scope visitCall (Call node , Optional <Scope > scope )
1070+ protected Scope visitCall (Call call , Optional <Scope > scope )
10601071 {
1061- return createAndAssignScope (node , scope );
1072+ if (analysis .isDescribe ()) {
1073+ return createAndAssignScope (call , scope );
1074+ }
1075+ QualifiedObjectName procedureName = createQualifiedObjectName (session , call , call .getName ());
1076+ ConnectorId connectorId = metadata .getCatalogHandle (session , procedureName .getCatalogName ())
1077+ .orElseThrow (() -> new SemanticException (MISSING_CATALOG , call , "Catalog %s does not exist" , procedureName .getCatalogName ()));
1078+ DistributedProcedure procedure = metadata .getProcedureRegistry ().resolveDistributed (connectorId , toSchemaTableName (procedureName ));
1079+
1080+ Object [] values = extractParameterValuesInOrder (call , procedure , metadata , session , analysis .getParameters ());
1081+ ImmutableList .Builder <String > partNamesBuilder = ImmutableList .builder ();
1082+ List <String > partNames = partNamesBuilder .add (procedure .getSchema (values ))
1083+ .add (procedure .getTableName (values ))
1084+ .build ();
1085+ QualifiedName qualifiedName = QualifiedName .of (partNames );
1086+ QualifiedObjectName tableName = createQualifiedObjectName (session , call , qualifiedName );
1087+
1088+ analysis .setUpdateType ("CALL" );
1089+ analysis .setProcedureArguments (Optional .of (values ));
1090+
1091+ String filter = procedure .getFilter (values );
1092+ Expression filterExpression = sqlParser .createExpression (filter );
1093+ QuerySpecification querySpecification = new QuerySpecification (
1094+ selectList (new AllColumns ()),
1095+ Optional .of (new Table (qualifiedName )),
1096+ Optional .of (filterExpression ),
1097+ Optional .empty (),
1098+ Optional .empty (),
1099+ Optional .empty (),
1100+ Optional .empty (),
1101+ Optional .empty ());
1102+ Query query = new Query (Optional .empty (), querySpecification , Optional .empty (), Optional .empty (), Optional .empty ());
1103+ StatementAnalyzer analyzer = new StatementAnalyzer (analysis , metadata , sqlParser , accessControl , session , warningCollector );
1104+ analyzer .analyze (query , scope );
1105+ analysis .setCurrentQuery (query );
1106+
1107+ TableHandle tableHandle = metadata .getHandleVersion (session , tableName , Optional .empty ())
1108+ .orElseThrow (() -> (new SemanticException (MISSING_TABLE , call , "Table '%s' does not exist" , tableName )));
1109+ analysis .setCallTarget (tableHandle );
1110+ return createAndAssignScope (call , scope , Field .newUnqualified (Optional .empty (), "rows" , BIGINT ));
10621111 }
10631112
10641113 private void validateProperties (List <Property > properties , Optional <Scope > scope )
0 commit comments