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.