This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new 22b42b0e77 GH-39558: [Java] Add SQL_ALL_TABLES_ARE_SELECTABLE,
SQL_NULL_ORDERING and SQL_MAX_COLUMNS_IN_TABLE support to SqlInfoBuilder
(#39561)
22b42b0e77 is described below
commit 22b42b0e7718c91cc80390090f64fda312ff93a0
Author: Alexander Blazhkov <[email protected]>
AuthorDate: Fri Jan 12 22:56:04 2024 +0300
GH-39558: [Java] Add SQL_ALL_TABLES_ARE_SELECTABLE, SQL_NULL_ORDERING and
SQL_MAX_COLUMNS_IN_TABLE support to SqlInfoBuilder (#39561)
This PR adds ability to specify `SQL_ALL_TABLES_ARE_SELECTABLE` and
`SQL_NULL_ORDERING` metadata in `org.apache.arrow.flight.sql.SqlInfoBuilder`.
### Rationale for this change
Without this change it is impossible to specify whether all tables are
selectable, supported null ordering and maximum number of columns in table
using `SqlInfoBuilder`.
### What changes are included in this PR?
In this PR two methods are added to `SqlInfoBuilder`:
- `withSqlAllTablesAreSelectable` accepting boolean parameter that
specifies whether all tables are selectable
- `withSqlNullOrdering` accepting
`org.apache.arrow.flight.sql.impl.FlightSql.SqlNullOrdering` value that
specifies supported null ordering
- `withSqlMaxColumnsInTable` accepting long parameter that specifies
maximum number of columns in table
### Are these changes tested?
To ensure correctness
`org.apache.arrow.flight.TestFlightSql#testGetSqlInfoResultsWithManyArgs` test
is added).
### Are there any user-facing changes?
This PR does not contain any breaking changes of user API.
* Closes: #39558
Authored-by: Alexander Blazhkov <[email protected]>
Signed-off-by: David Li <[email protected]>
---
.../apache/arrow/flight/sql/SqlInfoBuilder.java | 31 ++++++++++++++
.../org/apache/arrow/flight/TestFlightSql.java | 48 +++++++++++-----------
.../arrow/flight/sql/example/FlightSqlExample.java | 5 ++-
3 files changed, 60 insertions(+), 24 deletions(-)
diff --git
a/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/SqlInfoBuilder.java
b/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/SqlInfoBuilder.java
index 18793f9b90..251a709f63 100644
---
a/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/SqlInfoBuilder.java
+++
b/java/flight/flight-sql/src/main/java/org/apache/arrow/flight/sql/SqlInfoBuilder.java
@@ -32,6 +32,7 @@ import java.util.function.Consumer;
import java.util.function.ObjIntConsumer;
import org.apache.arrow.flight.sql.impl.FlightSql.SqlInfo;
+import org.apache.arrow.flight.sql.impl.FlightSql.SqlNullOrdering;
import org.apache.arrow.flight.sql.impl.FlightSql.SqlOuterJoinsSupportLevel;
import org.apache.arrow.flight.sql.impl.FlightSql.SqlSupportedCaseSensitivity;
import org.apache.arrow.flight.sql.impl.FlightSql.SqlSupportedElementActions;
@@ -502,6 +503,26 @@ public class SqlInfoBuilder {
return withBitIntProvider(SqlInfo.SQL_QUOTED_IDENTIFIER_CASE_VALUE,
value.getNumber());
}
+ /**
+ * Sets a value for {@link SqlInfo#SQL_ALL_TABLES_ARE_SELECTABLE} in the
builder.
+ *
+ * @param value the value for {@link SqlInfo#SQL_ALL_TABLES_ARE_SELECTABLE}
to be set.
+ * @return the SqlInfoBuilder itself.
+ */
+ public SqlInfoBuilder withSqlAllTablesAreSelectable(final boolean value) {
+ return withBooleanProvider(SqlInfo.SQL_ALL_TABLES_ARE_SELECTABLE_VALUE,
value);
+ }
+
+ /**
+ * Sets a value for {@link SqlInfo#SQL_NULL_ORDERING} in the builder.
+ *
+ * @param value the value for {@link SqlInfo#SQL_NULL_ORDERING} to be set.
+ * @return the SqlInfoBuilder itself.
+ */
+ public SqlInfoBuilder withSqlNullOrdering(final SqlNullOrdering value) {
+ return withBitIntProvider(SqlInfo.SQL_NULL_ORDERING_VALUE,
value.getNumber());
+ }
+
/**
* Sets a value SqlInf @link SqlInfo#SQL_MAX_BINARY_LITERAL_LENGTH} in the
builder.
*
@@ -572,6 +593,16 @@ public class SqlInfoBuilder {
return withBitIntProvider(SqlInfo.SQL_MAX_COLUMNS_IN_SELECT_VALUE, value);
}
+ /**
+ * Sets a value for {@link SqlInfo#SQL_MAX_COLUMNS_IN_TABLE} in the builder.
+ *
+ * @param value the value for {@link SqlInfo#SQL_MAX_COLUMNS_IN_TABLE} to be
set.
+ * @return the SqlInfoBuilder itself.
+ */
+ public SqlInfoBuilder withSqlMaxColumnsInTable(final long value) {
+ return withBitIntProvider(SqlInfo.SQL_MAX_COLUMNS_IN_TABLE_VALUE, value);
+ }
+
/**
* Sets a value for {@link SqlInfo#SQL_MAX_CONNECTIONS} in the builder.
*
diff --git
a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java
b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java
index 7635b80ecd..948364a920 100644
---
a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java
+++
b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/TestFlightSql.java
@@ -106,6 +106,12 @@ public class TestFlightSql {
.put(Integer.toString(FlightSql.SqlInfo.FLIGHT_SQL_SERVER_ARROW_VERSION_VALUE),
"10.14.2.0 - (1828579)");
GET_SQL_INFO_EXPECTED_RESULTS_MAP
.put(Integer.toString(FlightSql.SqlInfo.FLIGHT_SQL_SERVER_READ_ONLY_VALUE),
"false");
+ GET_SQL_INFO_EXPECTED_RESULTS_MAP
+
.put(Integer.toString(FlightSql.SqlInfo.SQL_ALL_TABLES_ARE_SELECTABLE_VALUE),
"true");
+ GET_SQL_INFO_EXPECTED_RESULTS_MAP
+ .put(
+ Integer.toString(FlightSql.SqlInfo.SQL_NULL_ORDERING_VALUE),
+
Integer.toString(FlightSql.SqlNullOrdering.SQL_NULLS_SORTED_AT_END_VALUE));
GET_SQL_INFO_EXPECTED_RESULTS_MAP
.put(Integer.toString(FlightSql.SqlInfo.SQL_DDL_CATALOG_VALUE),
"false");
GET_SQL_INFO_EXPECTED_RESULTS_MAP
@@ -122,6 +128,8 @@ public class TestFlightSql {
.put(
Integer.toString(FlightSql.SqlInfo.SQL_QUOTED_IDENTIFIER_CASE_VALUE),
Integer.toString(SqlSupportedCaseSensitivity.SQL_CASE_SENSITIVITY_CASE_INSENSITIVE_VALUE));
+ GET_SQL_INFO_EXPECTED_RESULTS_MAP
+
.put(Integer.toString(FlightSql.SqlInfo.SQL_MAX_COLUMNS_IN_TABLE_VALUE), "42");
}
@AfterAll
@@ -135,12 +143,15 @@ public class TestFlightSql {
FlightSql.SqlInfo.FLIGHT_SQL_SERVER_VERSION,
FlightSql.SqlInfo.FLIGHT_SQL_SERVER_ARROW_VERSION,
FlightSql.SqlInfo.FLIGHT_SQL_SERVER_READ_ONLY,
+ FlightSql.SqlInfo.SQL_ALL_TABLES_ARE_SELECTABLE,
+ FlightSql.SqlInfo.SQL_NULL_ORDERING,
FlightSql.SqlInfo.SQL_DDL_CATALOG,
FlightSql.SqlInfo.SQL_DDL_SCHEMA,
FlightSql.SqlInfo.SQL_DDL_TABLE,
FlightSql.SqlInfo.SQL_IDENTIFIER_CASE,
FlightSql.SqlInfo.SQL_IDENTIFIER_QUOTE_CHAR,
- FlightSql.SqlInfo.SQL_QUOTED_IDENTIFIER_CASE);
+ FlightSql.SqlInfo.SQL_QUOTED_IDENTIFIER_CASE,
+ FlightSql.SqlInfo.SQL_MAX_COLUMNS_IN_TABLE);
}
private static List<List<String>> getNonConformingResultsForGetSqlInfo(
@@ -152,6 +163,7 @@ public class TestFlightSql {
final List<String> result = results.get(index);
final String providedName = result.get(0);
final String expectedName = Integer.toString(args[index].getNumber());
+ System.err.println(expectedName);
if
(!(GET_SQL_INFO_EXPECTED_RESULTS_MAP.get(providedName).equals(result.get(1)) &&
providedName.equals(expectedName))) {
nonConformingResults.add(result);
@@ -603,31 +615,21 @@ public class TestFlightSql {
}
@Test
- public void testGetSqlInfoResultsWithTwoArgs() throws Exception {
- final FlightSql.SqlInfo[] args = {
- FlightSql.SqlInfo.FLIGHT_SQL_SERVER_NAME,
- FlightSql.SqlInfo.FLIGHT_SQL_SERVER_VERSION};
- final FlightInfo info = sqlClient.getSqlInfo(args);
- try (final FlightStream stream =
sqlClient.getStream(info.getEndpoints().get(0).getTicket())) {
- Assertions.assertAll(
- () -> MatcherAssert.assertThat(
- stream.getSchema(),
- is(FlightSqlProducer.Schemas.GET_SQL_INFO_SCHEMA)
- ),
- () -> MatcherAssert.assertThat(
- getNonConformingResultsForGetSqlInfo(getResults(stream), args),
- is(emptyList())
- )
- );
- }
- }
-
- @Test
- public void testGetSqlInfoResultsWithThreeArgs() throws Exception {
+ public void testGetSqlInfoResultsWithManyArgs() throws Exception {
final FlightSql.SqlInfo[] args = {
FlightSql.SqlInfo.FLIGHT_SQL_SERVER_NAME,
FlightSql.SqlInfo.FLIGHT_SQL_SERVER_VERSION,
- FlightSql.SqlInfo.SQL_IDENTIFIER_QUOTE_CHAR};
+ FlightSql.SqlInfo.FLIGHT_SQL_SERVER_ARROW_VERSION,
+ FlightSql.SqlInfo.FLIGHT_SQL_SERVER_READ_ONLY,
+ FlightSql.SqlInfo.SQL_ALL_TABLES_ARE_SELECTABLE,
+ FlightSql.SqlInfo.SQL_NULL_ORDERING,
+ FlightSql.SqlInfo.SQL_DDL_CATALOG,
+ FlightSql.SqlInfo.SQL_DDL_SCHEMA,
+ FlightSql.SqlInfo.SQL_DDL_TABLE,
+ FlightSql.SqlInfo.SQL_IDENTIFIER_CASE,
+ FlightSql.SqlInfo.SQL_IDENTIFIER_QUOTE_CHAR,
+ FlightSql.SqlInfo.SQL_QUOTED_IDENTIFIER_CASE,
+ FlightSql.SqlInfo.SQL_MAX_COLUMNS_IN_TABLE};
final FlightInfo info = sqlClient.getSqlInfo(args);
try (final FlightStream stream =
sqlClient.getStream(info.getEndpoints().get(0).getTicket())) {
Assertions.assertAll(
diff --git
a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java
b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java
index 3cc8f4a1c1..11f38ded5f 100644
---
a/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java
+++
b/java/flight/flight-sql/src/test/java/org/apache/arrow/flight/sql/example/FlightSqlExample.java
@@ -237,7 +237,10 @@ public class FlightSqlExample implements
FlightSqlProducer, AutoCloseable {
SqlSupportedCaseSensitivity.SQL_CASE_SENSITIVITY_UPPERCASE :
metaData.storesLowerCaseQuotedIdentifiers() ?
SqlSupportedCaseSensitivity.SQL_CASE_SENSITIVITY_LOWERCASE :
-
SqlSupportedCaseSensitivity.SQL_CASE_SENSITIVITY_UNKNOWN);
+ SqlSupportedCaseSensitivity.SQL_CASE_SENSITIVITY_UNKNOWN)
+ .withSqlAllTablesAreSelectable(true)
+ .withSqlNullOrdering(SqlNullOrdering.SQL_NULLS_SORTED_AT_END)
+ .withSqlMaxColumnsInTable(42);
} catch (SQLException e) {
throw new RuntimeException(e);
}