You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by an...@apache.org on 2019/01/26 17:08:50 UTC

[beam] branch master updated: [SQL] Fix CREATE EXTERNAL TABLE in non-default schema (#7627)

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 <ka...@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);