This is an automated email from the ASF dual-hosted git repository. anton pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push: new 5b46b02 [SQL] Fix CREATE EXTERNAL TABLE in non-default schema (#7627) 5b46b02 is described below commit 5b46b02b49ca1c5c18682427a5a4a25596ca4287 Author: Gleb Kanterov <kante...@users.noreply.github.com> AuthorDate: Sat Jan 26 18:08:37 2019 +0100 [SQL] Fix CREATE EXTERNAL TABLE in non-default schema (#7627) * [SQL] Fix CREATE EXTERNAL TABLE in non-default schema --- .../sql/impl/parser/SqlCreateExternalTable.java | 2 +- .../extensions/sql/impl/parser/SqlDdlNodes.java | 13 ++++-- .../sdk/extensions/sql/impl/BeamSqlEnvTest.java | 49 ++++++++++++++++++++++ .../extensions/sql/impl/parser/BeamDDLTest.java | 14 +++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlCreateExternalTable.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlCreateExternalTable.java index 1ff2276..7041e33 100644 --- a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlCreateExternalTable.java +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlCreateExternalTable.java @@ -151,7 +151,7 @@ public class SqlCreateExternalTable extends SqlCreate implements SqlExecutableSt private Table toTable() { return Table.builder() .type(SqlDdlNodes.getString(type)) - .name(name.getSimple()) + .name(SqlDdlNodes.name(name)) .schema(columnList.stream().collect(toSchema())) .comment(SqlDdlNodes.getString(comment)) .location(SqlDdlNodes.getString(location)) diff --git a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlDdlNodes.java b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlDdlNodes.java index c508502..d9ceeb5 100644 --- a/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlDdlNodes.java +++ b/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/parser/SqlDdlNodes.java @@ -48,20 +48,25 @@ public class SqlDdlNodes { /** Returns the schema in which to create an object. */ static Pair<CalciteSchema, String> schema( CalcitePrepare.Context context, boolean mutable, SqlIdentifier id) { - final String name; final List<String> path; if (id.isSimple()) { path = context.getDefaultSchemaPath(); - name = id.getSimple(); } else { path = Util.skipLast(id.names); - name = Util.last(id.names); } CalciteSchema schema = mutable ? context.getMutableRootSchema() : context.getRootSchema(); for (String p : path) { schema = schema.getSubSchema(p, true); } - return Pair.of(schema, name); + return Pair.of(schema, name(id)); + } + + static String name(SqlIdentifier id) { + if (id.isSimple()) { + return id.getSimple(); + } else { + return Util.last(id.names); + } } static @Nullable String getString(SqlNode n) { diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/BeamSqlEnvTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/BeamSqlEnvTest.java new file mode 100644 index 0000000..b812e4c --- /dev/null +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/BeamSqlEnvTest.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.beam.sdk.extensions.sql.impl; + +import static org.junit.Assert.assertEquals; + +import java.sql.Connection; +import java.sql.ResultSet; +import org.apache.beam.sdk.extensions.sql.meta.provider.test.TestTableProvider; +import org.junit.Test; + +/** Tests for {@link BeamSqlEnv}. */ +public class BeamSqlEnvTest { + + @Test + public void testCreateExternalTableInNestedTableProvider() throws Exception { + TestTableProvider root = new TestTableProvider(); + TestTableProvider nested = new TestTableProvider(); + TestTableProvider anotherOne = new TestTableProvider(); + + BeamSqlEnv env = BeamSqlEnv.withTableProvider(root); + env.addSchema("nested", nested); + env.addSchema("anotherOne", anotherOne); + + Connection connection = env.connection; + connection.createStatement().execute("CREATE EXTERNAL TABLE nested.person (id INT) TYPE test"); + connection.createStatement().execute("INSERT INTO nested.person(id) VALUES (1), (2), (6)"); + + ResultSet rs = connection.createStatement().executeQuery("SELECT SUM(id) FROM nested.person"); + rs.next(); + + assertEquals(9, rs.getInt(1)); + } +} diff --git a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/parser/BeamDDLTest.java b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/parser/BeamDDLTest.java index bf77c14..53e05f7 100644 --- a/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/parser/BeamDDLTest.java +++ b/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/impl/parser/BeamDDLTest.java @@ -163,6 +163,20 @@ public class BeamDDLTest { } @Test + public void testParseCreateExternalTable_withDatabase() throws Exception { + TestTableProvider rootProvider = new TestTableProvider(); + TestTableProvider testProvider = new TestTableProvider(); + + BeamSqlEnv env = BeamSqlEnv.withTableProvider(rootProvider); + env.addSchema("test", testProvider); + + assertNull(testProvider.getTables().get("person")); + env.executeDdl("CREATE EXTERNAL TABLE test.person (id INT) TYPE text"); + + assertNotNull(testProvider.getTables().get("person")); + } + + @Test public void testParseDropTable() throws Exception { TestTableProvider tableProvider = new TestTableProvider(); BeamSqlEnv env = BeamSqlEnv.withTableProvider(tableProvider);