1313 */
1414package com .facebook .presto .sql .analyzer ;
1515
16+ import com .facebook .presto .common .resourceGroups .QueryType ;
17+ import com .facebook .presto .spi .ConnectorId ;
1618import com .facebook .presto .spi .PrestoException ;
1719import com .facebook .presto .spi .WarningCollector ;
1820import com .facebook .presto .spi .analyzer .AnalyzerOptions ;
21+ import com .facebook .presto .spi .procedure .DistributedProcedure ;
22+ import com .facebook .presto .spi .procedure .IProcedureRegistry ;
23+ import com .facebook .presto .spi .procedure .Procedure ;
24+ import com .facebook .presto .spi .procedure .TestProcedureRegistry ;
1925import com .facebook .presto .sql .analyzer .BuiltInQueryPreparer .BuiltInPreparedQuery ;
2026import com .facebook .presto .sql .parser .SqlParser ;
2127import com .facebook .presto .sql .tree .AllColumns ;
28+ import com .facebook .presto .sql .tree .Call ;
29+ import com .facebook .presto .sql .tree .CallArgument ;
2230import com .facebook .presto .sql .tree .QualifiedName ;
31+ import com .facebook .presto .sql .tree .StringLiteral ;
2332import com .google .common .collect .ImmutableMap ;
33+ import org .testng .annotations .BeforeClass ;
2434import org .testng .annotations .Test ;
2535
36+ import java .util .ArrayList ;
37+ import java .util .List ;
2638import java .util .Map ;
2739import java .util .Optional ;
2840
41+ import static com .facebook .presto .common .type .StandardTypes .VARCHAR ;
2942import static com .facebook .presto .spi .StandardErrorCode .NOT_FOUND ;
43+ import static com .facebook .presto .spi .procedure .DistributedProcedure .SCHEMA ;
44+ import static com .facebook .presto .spi .procedure .DistributedProcedure .TABLE_NAME ;
3045import static com .facebook .presto .sql .QueryUtil .selectList ;
3146import static com .facebook .presto .sql .QueryUtil .simpleQuery ;
3247import static com .facebook .presto .sql .QueryUtil .table ;
3348import static com .facebook .presto .sql .analyzer .SemanticErrorCode .INVALID_PARAMETER_USAGE ;
3449import static org .testng .Assert .assertEquals ;
50+ import static org .testng .Assert .assertTrue ;
3551import static org .testng .Assert .fail ;
3652
3753public class TestBuiltInQueryPreparer
3854{
3955 private static final SqlParser SQL_PARSER = new SqlParser ();
40- private static final BuiltInQueryPreparer QUERY_PREPARER = new BuiltInQueryPreparer (SQL_PARSER );
4156 private static final Map <String , String > emptyPreparedStatements = ImmutableMap .of ();
4257 private static final AnalyzerOptions testAnalyzerOptions = AnalyzerOptions .builder ().build ();
58+ private static IProcedureRegistry procedureRegistry ;
59+ private static BuiltInQueryPreparer queryPreparer ;
60+
61+ @ BeforeClass
62+ public void setup ()
63+ {
64+ procedureRegistry = new TestProcedureRegistry ();
65+ List <Procedure .Argument > arguments = new ArrayList <>();
66+ arguments .add (new Procedure .Argument (SCHEMA , VARCHAR ));
67+ arguments .add (new Procedure .Argument (TABLE_NAME , VARCHAR ));
68+
69+ List <Procedure > procedures = new ArrayList <>();
70+ procedures .add (new Procedure ("system" , "fun" , arguments ));
71+ procedures .add (new DistributedProcedure ("system" , "distributed_fun" ,
72+ arguments ,
73+ (session , transactionContext , procedureHandle , fragments ) -> null ,
74+ (transactionContext , procedureHandle , fragments ) -> {}));
75+ procedureRegistry .addProcedures (new ConnectorId ("test" ), procedures );
76+ queryPreparer = new BuiltInQueryPreparer (SQL_PARSER , procedureRegistry );
77+ }
4378
4479 @ Test
4580 public void testSelectStatement ()
4681 {
47- BuiltInPreparedQuery preparedQuery = QUERY_PREPARER .prepareQuery (testAnalyzerOptions , "SELECT * FROM foo" , emptyPreparedStatements , WarningCollector .NOOP );
82+ BuiltInPreparedQuery preparedQuery = queryPreparer .prepareQuery (testAnalyzerOptions , "SELECT * FROM foo" , emptyPreparedStatements , WarningCollector .NOOP );
4883 assertEquals (preparedQuery .getStatement (),
4984 simpleQuery (selectList (new AllColumns ()), table (QualifiedName .of ("foo" ))));
5085 }
5186
87+ @ Test
88+ public void testCallProcedureStatement ()
89+ {
90+ BuiltInPreparedQuery preparedQuery = queryPreparer .prepareQuery (testAnalyzerOptions , "call test.system.fun('a', 'b')" , emptyPreparedStatements , WarningCollector .NOOP );
91+ List <CallArgument > arguments = new ArrayList <>();
92+ arguments .add (new CallArgument (new StringLiteral ("a" )));
93+ arguments .add (new CallArgument (new StringLiteral ("b" )));
94+ assertEquals (preparedQuery .getStatement (),
95+ new Call (QualifiedName .of ("test" , "system" , "fun" ), arguments ));
96+ assertTrue (preparedQuery .getQueryType ().isPresent ());
97+ assertEquals (preparedQuery .getQueryType ().get (), QueryType .DATA_DEFINITION );
98+ }
99+
100+ @ Test
101+ public void testCallDistributedProcedureStatement ()
102+ {
103+ BuiltInPreparedQuery preparedQuery = queryPreparer .prepareQuery (testAnalyzerOptions , "call test.system.distributed_fun('a', 'b')" , emptyPreparedStatements , WarningCollector .NOOP );
104+ List <CallArgument > arguments = new ArrayList <>();
105+ arguments .add (new CallArgument (new StringLiteral ("a" )));
106+ arguments .add (new CallArgument (new StringLiteral ("b" )));
107+ assertEquals (preparedQuery .getStatement (),
108+ new Call (QualifiedName .of ("test" , "system" , "distributed_fun" ), arguments ));
109+ assertTrue (preparedQuery .getQueryType ().isPresent ());
110+ assertEquals (preparedQuery .getQueryType ().get (), QueryType .CALL_DISTRIBUTED_PROCEDURE );
111+ }
112+
52113 @ Test
53114 public void testExecuteStatement ()
54115 {
55116 Map <String , String > preparedStatements = ImmutableMap .of ("my_query" , "SELECT * FROM foo" );
56- BuiltInPreparedQuery preparedQuery = QUERY_PREPARER .prepareQuery (testAnalyzerOptions , "EXECUTE my_query" , preparedStatements , WarningCollector .NOOP );
117+ BuiltInPreparedQuery preparedQuery = queryPreparer .prepareQuery (testAnalyzerOptions , "EXECUTE my_query" , preparedStatements , WarningCollector .NOOP );
57118 assertEquals (preparedQuery .getStatement (),
58119 simpleQuery (selectList (new AllColumns ()), table (QualifiedName .of ("foo" ))));
59120 }
@@ -62,7 +123,7 @@ public void testExecuteStatement()
62123 public void testExecuteStatementDoesNotExist ()
63124 {
64125 try {
65- QUERY_PREPARER .prepareQuery (testAnalyzerOptions , "execute my_query" , emptyPreparedStatements , WarningCollector .NOOP );
126+ queryPreparer .prepareQuery (testAnalyzerOptions , "execute my_query" , emptyPreparedStatements , WarningCollector .NOOP );
66127 fail ("expected exception" );
67128 }
68129 catch (PrestoException e ) {
@@ -75,7 +136,7 @@ public void testTooManyParameters()
75136 {
76137 try {
77138 Map <String , String > preparedStatements = ImmutableMap .of ("my_query" , "SELECT * FROM foo where col1 = ?" );
78- QUERY_PREPARER .prepareQuery (testAnalyzerOptions , "EXECUTE my_query USING 1,2" , preparedStatements , WarningCollector .NOOP );
139+ queryPreparer .prepareQuery (testAnalyzerOptions , "EXECUTE my_query USING 1,2" , preparedStatements , WarningCollector .NOOP );
79140 fail ("expected exception" );
80141 }
81142 catch (SemanticException e ) {
@@ -88,7 +149,7 @@ public void testTooFewParameters()
88149 {
89150 try {
90151 Map <String , String > preparedStatements = ImmutableMap .of ("my_query" , "SELECT ? FROM foo where col1 = ?" );
91- QUERY_PREPARER .prepareQuery (testAnalyzerOptions , "EXECUTE my_query USING 1" , preparedStatements , WarningCollector .NOOP );
152+ queryPreparer .prepareQuery (testAnalyzerOptions , "EXECUTE my_query USING 1" , preparedStatements , WarningCollector .NOOP );
92153 fail ("expected exception" );
93154 }
94155 catch (SemanticException e ) {
@@ -100,7 +161,7 @@ public void testTooFewParameters()
100161 public void testFormattedQuery ()
101162 {
102163 AnalyzerOptions analyzerOptions = AnalyzerOptions .builder ().setLogFormattedQueryEnabled (true ).build ();
103- BuiltInPreparedQuery preparedQuery = QUERY_PREPARER .prepareQuery (
164+ BuiltInPreparedQuery preparedQuery = queryPreparer .prepareQuery (
104165 analyzerOptions ,
105166 "PREPARE test FROM SELECT * FROM foo where col1 = ?" ,
106167 emptyPreparedStatements ,
@@ -112,7 +173,7 @@ public void testFormattedQuery()
112173 " foo\n " +
113174 " WHERE (col1 = ?)\n " ));
114175
115- preparedQuery = QUERY_PREPARER .prepareQuery (
176+ preparedQuery = queryPreparer .prepareQuery (
116177 analyzerOptions ,
117178 "PREPARE test FROM SELECT * FROM foo" ,
118179 emptyPreparedStatements ,
0 commit comments