You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by el...@apache.org on 2020/08/03 00:58:25 UTC

[calcite-avatica] branch master updated: [CALCITE-4138] Metadata operations via Avatica turn empty string args to null

This is an automated email from the ASF dual-hosted git repository.

elserj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite-avatica.git


The following commit(s) were added to refs/heads/master by this push:
     new 08f2a04  [CALCITE-4138] Metadata operations via Avatica turn empty string args to null
08f2a04 is described below

commit 08f2a0411361a6e200c40a0392d75a877639dbfe
Author: Istvan Toth <st...@apache.org>
AuthorDate: Sat Jul 25 11:14:41 2020 +0200

    [CALCITE-4138] Metadata operations via Avatica turn empty string args to null
    
    Closes #123
    
    Signed-off-by: Josh Elser <el...@apache.org>
---
 .../org/apache/calcite/avatica/remote/Service.java | 25 ++++++++++++++++++++
 core/src/main/protobuf/requests.proto              |  9 ++++++++
 .../apache/calcite/avatica/RemoteDriverTest.java   | 19 +++++++++++++++
 site/_docs/protobuf_reference.md                   | 27 ++++++++++++++++++++++
 4 files changed, 80 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/avatica/remote/Service.java b/core/src/main/java/org/apache/calcite/avatica/remote/Service.java
index 1a5aa43..270a0c3 100644
--- a/core/src/main/java/org/apache/calcite/avatica/remote/Service.java
+++ b/core/src/main/java/org/apache/calcite/avatica/remote/Service.java
@@ -334,14 +334,19 @@ public interface Service {
         connectionId = msg.getConnectionId();
       }
 
+      //hasField() for String fields simply tells you if that field is ""
       String catalog = null;
       if (msg.hasField(CATALOG_DESCRIPTOR)) {
         catalog = msg.getCatalog();
+      } else if (msg.getHasCatalog()) {
+        catalog = "";
       }
 
       String schemaPattern = null;
       if (msg.hasField(SCHEMA_PATTERN_DESCRIPTOR)) {
         schemaPattern = msg.getSchemaPattern();
+      } else if (msg.getHasSchemaPattern()) {
+        schemaPattern = "";
       }
 
       return new SchemasRequest(connectionId, catalog, schemaPattern);
@@ -354,9 +359,12 @@ public interface Service {
       }
       if (null != catalog) {
         builder.setCatalog(catalog);
+        builder.setHasCatalog(true);
       }
+
       if (null != schemaPattern) {
         builder.setSchemaPattern(schemaPattern);
+        builder.setHasSchemaPattern(true);
       }
 
       return builder.build();
@@ -435,16 +443,22 @@ public interface Service {
       String catalog = null;
       if (msg.hasField(CATALOG_DESCRIPTOR)) {
         catalog = msg.getCatalog();
+      } else if (msg.getHasCatalog()) {
+        catalog = "";
       }
 
       String schemaPattern = null;
       if (msg.hasField(SCHEMA_PATTERN_DESCRIPTOR)) {
         schemaPattern = msg.getSchemaPattern();
+      } else if (msg.getHasSchemaPattern()) {
+        schemaPattern = "";
       }
 
       String tableNamePattern = null;
       if (msg.hasField(TABLE_NAME_PATTERN_DESCRIPTOR)) {
         tableNamePattern = msg.getTableNamePattern();
+      } else if (msg.getHasTableNamePattern()) {
+        tableNamePattern = "";
       }
 
       // Cannot determine if a value was set for a repeated field. Must use an extra boolean
@@ -465,12 +479,15 @@ public interface Service {
       }
       if (null != catalog) {
         builder.setCatalog(catalog);
+        builder.setHasCatalog(true);
       }
       if (null != schemaPattern) {
         builder.setSchemaPattern(schemaPattern);
+        builder.setHasSchemaPattern(true);
       }
       if (null != tableNamePattern) {
         builder.setTableNamePattern(tableNamePattern);
+        builder.setHasTableNamePattern(true);
       }
       if (null != typeList) {
         builder.setHasTypeList(true);
@@ -616,21 +633,29 @@ public interface Service {
       String catalog = null;
       if (msg.hasField(CATALOG_DESCRIPTOR)) {
         catalog = msg.getCatalog();
+      } else if (msg.getHasCatalog()) {
+        catalog = "";
       }
 
       String schemaPattern = null;
       if (msg.hasField(SCHEMA_PATTERN_DESCRIPTOR)) {
         schemaPattern = msg.getSchemaPattern();
+      } else if (msg.getHasSchemaPattern()) {
+        schemaPattern = "";
       }
 
       String tableNamePattern = null;
       if (msg.hasField(TABLE_NAME_PATTERN_DESCRIPTOR)) {
         tableNamePattern = msg.getTableNamePattern();
+      } else if (msg.getHasTableNamePattern()) {
+        tableNamePattern = "";
       }
 
       String columnNamePattern = null;
       if (msg.hasField(COLUMN_NAME_PATTERN_DESCRIPTOR)) {
         columnNamePattern = msg.getColumnNamePattern();
+      } else if (msg.getHasColumnNamePattern()) {
+        columnNamePattern = "";
       }
 
       return new ColumnsRequest(connectionId, catalog, schemaPattern, tableNamePattern,
diff --git a/core/src/main/protobuf/requests.proto b/core/src/main/protobuf/requests.proto
index 07b40cc..c56011d 100644
--- a/core/src/main/protobuf/requests.proto
+++ b/core/src/main/protobuf/requests.proto
@@ -35,6 +35,8 @@ message SchemasRequest {
   string catalog = 1;
   string schema_pattern = 2;
   string connection_id = 3;
+  bool has_catalog = 4;
+  bool has_schema_pattern = 5;
 }
 
 // Request for Request for Meta#getTables(String, org.apache.calcite.avatica.Meta.Pat,
@@ -46,6 +48,9 @@ message TablesRequest {
   repeated string type_list = 4;
   bool has_type_list = 6; // Having an empty type_list is distinct from a null type_list
   string connection_id = 7;
+  bool has_catalog = 8;
+  bool has_schema_pattern = 9;
+  bool has_table_name_pattern = 10;
 }
 
 // Request for Meta#getTableTypes()
@@ -61,6 +66,10 @@ message ColumnsRequest {
   string table_name_pattern = 3;
   string column_name_pattern = 4;
   string connection_id = 5;
+  bool has_catalog = 6;
+  bool has_schema_pattern = 7;
+  bool has_table_name_pattern = 8;
+  bool has_column_name_pattern = 9;
 }
 
 // Request for Meta#getTypeInfo()
diff --git a/server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java b/server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
index 66fcf8c..ffcc64d 100644
--- a/server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
+++ b/server/src/test/java/org/apache/calcite/avatica/RemoteDriverTest.java
@@ -1475,6 +1475,25 @@ public class RemoteDriverTest {
     }
   }
 
+  @Test public void testMetaDataCanHaveEmptyStringArgument() throws Exception {
+    ConnectionSpec.getDatabaseLock().lock();
+    try (Connection conn = getLocalConnection();
+        Statement stmt = conn.createStatement()) {
+      DatabaseMetaData meta = conn.getMetaData();
+
+      ResultSet rs = meta.getSchemas("PUBLIC", null);
+      assertTrue(rs.next());
+      rs.close();
+
+      //Test for CALCITE-4138
+      rs = meta.getSchemas("PUBLIC", "");
+      assertFalse(rs.next());
+      rs.close();
+    } finally {
+      ConnectionSpec.getDatabaseLock().unlock();
+    }
+  }
+
   @Test public void testUnicodeColumnNames() throws Exception {
     final String tableName = "unicodeColumn";
     final String columnName = "\u041d\u043e\u043c\u0435\u0440\u0422\u0435\u043b"
diff --git a/site/_docs/protobuf_reference.md b/site/_docs/protobuf_reference.md
index d5f7be6..327522e 100644
--- a/site/_docs/protobuf_reference.md
+++ b/site/_docs/protobuf_reference.md
@@ -174,6 +174,10 @@ message ColumnsRequest {
   string table_name_pattern = 3;
   string column_name_pattern = 4;
   string connection_id = 5;
+  bool   has_catalog = 6;
+  bool   has_schema_pattern = 7;
+  bool   has_table_name_pattern = 8;
+  bool   has_column_name_pattern = 9;
 }
 {% endhighlight %}
 
@@ -187,6 +191,14 @@ message ColumnsRequest {
 
 `connection_id` The identifier of the connection which to use to fetch the columns.
 
+`has_catalog` A boolean denoting if `catalog` was set.
+
+`has_schema_pattern` A boolean denoting if `schema_pattern` was set.
+
+`has_table_name_pattern` A boolean denoting if `table_name_pattern` was set.
+
+`has_column_name_pattern` A boolean denoting if `column_name_pattern` was set.
+
 ### CommitRequest
 
 This request is used to issue a `commit` on the Connection in the Avatica server identified by the given ID.
@@ -427,6 +439,8 @@ message SchemasRequest {
   string catalog = 1;
   string schema_pattern = 2;
   string connection_id = 3;
+  bool   has_catalog = 4;
+  bool   has_schema_pattern = 5;
 }
 {% endhighlight %}
 
@@ -436,6 +450,10 @@ message SchemasRequest {
 
 `connection_id` The identifier for the connection to fetch schemas from.
 
+`has_catalog` A boolean denoting if `catalog` was set.
+
+`has_schema_pattern` A boolean denoting if `schema_pattern` was set.
+
 ### TableTypesRequest
 
 This request is used to fetch the table types available in this database.
@@ -460,6 +478,9 @@ message TablesRequest {
   repeated string type_list = 4;
   bool has_type_list = 6;
   string connection_id = 7;
+  bool   has_catalog = 8;
+  bool   has_schema_pattern = 9;
+  bool   has_table_name_pattern = 10;
 }
 {% endhighlight %}
 
@@ -475,6 +496,12 @@ message TablesRequest {
 
 `connection_id` The identifier of the connection to fetch the tables from.
 
+`has_catalog` A boolean denoting if `catalog` was set.
+
+`has_schema_pattern` A boolean denoting if `schema_pattern` was set.
+
+`has_table_name_pattern` A boolean denoting if `table_name_pattern` was set.
+
 ### TypeInfoRequest
 
 This request is used to fetch the types available in this database.