1313 */
1414package com .facebook .presto .sql .analyzer ;
1515
16+ import com .facebook .presto .common .QualifiedObjectName ;
1617import com .facebook .presto .common .analyzer .PreparedQuery ;
1718import com .facebook .presto .common .resourceGroups .QueryType ;
19+ import com .facebook .presto .spi .ConnectorId ;
1820import com .facebook .presto .spi .PrestoException ;
1921import com .facebook .presto .spi .PrestoWarning ;
22+ import com .facebook .presto .spi .SchemaTableName ;
2023import com .facebook .presto .spi .WarningCollector ;
2124import com .facebook .presto .spi .analyzer .AnalyzerOptions ;
2225import com .facebook .presto .spi .analyzer .QueryPreparer ;
26+ import com .facebook .presto .spi .procedure .IProcedureRegistry ;
2327import com .facebook .presto .sql .analyzer .utils .StatementUtils ;
2428import com .facebook .presto .sql .parser .SqlParser ;
29+ import com .facebook .presto .sql .tree .Call ;
2530import com .facebook .presto .sql .tree .Execute ;
2631import com .facebook .presto .sql .tree .Explain ;
2732import com .facebook .presto .sql .tree .ExplainType ;
2833import com .facebook .presto .sql .tree .Expression ;
34+ import com .facebook .presto .sql .tree .QualifiedName ;
2935import com .facebook .presto .sql .tree .Statement ;
3036import com .google .common .collect .ImmutableList ;
3137import com .google .common .collect .ImmutableSet ;
3743import java .util .Optional ;
3844
3945import static com .facebook .presto .common .WarningHandlingLevel .AS_ERROR ;
46+ import static com .facebook .presto .common .resourceGroups .QueryType .CALL_DISTRIBUTED_PROCEDURE ;
4047import static com .facebook .presto .spi .StandardErrorCode .NOT_FOUND ;
4148import static com .facebook .presto .spi .StandardErrorCode .NOT_SUPPORTED ;
4249import static com .facebook .presto .spi .StandardErrorCode .WARNING_AS_ERROR ;
4350import static com .facebook .presto .sql .SqlFormatter .formatSql ;
4451import static com .facebook .presto .sql .analyzer .ConstantExpressionVerifier .verifyExpressionIsConstant ;
4552import static com .facebook .presto .sql .analyzer .SemanticErrorCode .INVALID_PARAMETER_USAGE ;
4653import static com .facebook .presto .sql .analyzer .utils .AnalyzerUtil .createParsingOptions ;
54+ import static com .facebook .presto .sql .analyzer .utils .MetadataUtils .createQualifiedObjectName ;
4755import static com .facebook .presto .sql .analyzer .utils .ParameterExtractor .getParameterCount ;
4856import static com .facebook .presto .sql .tree .ExplainType .Type .VALIDATE ;
4957import static java .lang .String .format ;
@@ -57,11 +65,15 @@ public class BuiltInQueryPreparer
5765 implements QueryPreparer
5866{
5967 private final SqlParser sqlParser ;
68+ private final IProcedureRegistry procedureRegistry ;
6069
6170 @ Inject
62- public BuiltInQueryPreparer (SqlParser sqlParser )
71+ public BuiltInQueryPreparer (
72+ SqlParser sqlParser ,
73+ IProcedureRegistry procedureRegistry )
6374 {
6475 this .sqlParser = requireNonNull (sqlParser , "sqlParser is null" );
76+ this .procedureRegistry = requireNonNull (procedureRegistry , "procedureRegistry is null" );
6577 }
6678
6779 @ Override
@@ -88,6 +100,17 @@ public BuiltInPreparedQuery prepareQuery(AnalyzerOptions analyzerOptions, Statem
88100 statement = sqlParser .createStatement (query , createParsingOptions (analyzerOptions ));
89101 }
90102
103+ Optional <QualifiedObjectName > distributedProcedureName = Optional .empty ();
104+ if (statement instanceof Call ) {
105+ QualifiedName qualifiedName = ((Call ) statement ).getName ();
106+ QualifiedObjectName qualifiedObjectName = createQualifiedObjectName (analyzerOptions .getSessionCatalogName (), analyzerOptions .getSessionSchemaName (), statement , qualifiedName );
107+ if (procedureRegistry .isDistributedProcedure (
108+ new ConnectorId (qualifiedObjectName .getCatalogName ()),
109+ new SchemaTableName (qualifiedObjectName .getSchemaName (), qualifiedObjectName .getObjectName ()))) {
110+ distributedProcedureName = Optional .of (qualifiedObjectName );
111+ }
112+ }
113+
91114 if (statement instanceof Explain && ((Explain ) statement ).isAnalyze ()) {
92115 Statement innerStatement = ((Explain ) statement ).getStatement ();
93116 Optional <QueryType > innerQueryType = StatementUtils .getQueryType (innerStatement .getClass ());
@@ -104,7 +127,7 @@ public BuiltInPreparedQuery prepareQuery(AnalyzerOptions analyzerOptions, Statem
104127 if (analyzerOptions .isLogFormattedQueryEnabled ()) {
105128 formattedQuery = Optional .of (getFormattedQuery (statement , parameters ));
106129 }
107- return new BuiltInPreparedQuery (wrappedStatement , statement , parameters , formattedQuery , prepareSql );
130+ return new BuiltInPreparedQuery (wrappedStatement , statement , parameters , formattedQuery , prepareSql , distributedProcedureName );
108131 }
109132
110133 private static String getFormattedQuery (Statement statement , List <Expression > parameters )
@@ -132,13 +155,19 @@ public static class BuiltInPreparedQuery
132155 private final Statement statement ;
133156 private final Statement wrappedStatement ;
134157 private final List <Expression > parameters ;
158+ private final Optional <QualifiedObjectName > distributedProcedureName ;
135159
136- public BuiltInPreparedQuery (Statement wrappedStatement , Statement statement , List <Expression > parameters , Optional <String > formattedQuery , Optional <String > prepareSql )
160+ public BuiltInPreparedQuery (
161+ Statement wrappedStatement ,
162+ Statement statement , List <Expression > parameters ,
163+ Optional <String > formattedQuery , Optional <String > prepareSql ,
164+ Optional <QualifiedObjectName > distributedProcedureName )
137165 {
138166 super (formattedQuery , prepareSql );
139167 this .wrappedStatement = requireNonNull (wrappedStatement , "wrappedStatement is null" );
140168 this .statement = requireNonNull (statement , "statement is null" );
141169 this .parameters = ImmutableList .copyOf (requireNonNull (parameters , "parameters is null" ));
170+ this .distributedProcedureName = requireNonNull (distributedProcedureName , "distributedProcedureName is null" );
142171 }
143172
144173 public Statement getStatement ()
@@ -158,9 +187,17 @@ public List<Expression> getParameters()
158187
159188 public Optional <QueryType > getQueryType ()
160189 {
190+ if (getDistributedProcedureName ().isPresent ()) {
191+ return Optional .of (CALL_DISTRIBUTED_PROCEDURE );
192+ }
161193 return StatementUtils .getQueryType (statement .getClass ());
162194 }
163195
196+ public Optional <QualifiedObjectName > getDistributedProcedureName ()
197+ {
198+ return this .distributedProcedureName ;
199+ }
200+
164201 public boolean isTransactionControlStatement ()
165202 {
166203 return StatementUtils .isTransactionControlStatement (getStatement ());
0 commit comments