You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ko...@apache.org on 2022/11/15 08:51:15 UTC
[arrow] 19/27: ARROW-18296: [Java] Honor Driver#connect API contract in JDBC driver (#14617)
This is an automated email from the ASF dual-hosted git repository.
kou pushed a commit to branch maint-10.0.x
in repository https://gitbox.apache.org/repos/asf/arrow.git
commit 26b0ec4db3c6f6b94e76ed4515e407e8955f1889
Author: David Li <li...@gmail.com>
AuthorDate: Wed Nov 9 19:59:17 2022 -0500
ARROW-18296: [Java] Honor Driver#connect API contract in JDBC driver (#14617)
Authored-by: David Li <li...@gmail.com>
Signed-off-by: David Li <li...@gmail.com>
---
.../arrow/driver/jdbc/ArrowFlightJdbcDriver.java | 16 +++++----
.../driver/jdbc/ArrowFlightJdbcDriverTest.java | 41 +++++++++++-----------
2 files changed, 30 insertions(+), 27 deletions(-)
diff --git a/java/flight/flight-sql-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java b/java/flight/flight-sql-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java
index a72fbd3a4d..aa1b460fc1 100644
--- a/java/flight/flight-sql-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java
+++ b/java/flight/flight-sql-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriver.java
@@ -29,6 +29,7 @@ import java.nio.charset.StandardCharsets;
import java.sql.SQLException;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import java.util.Properties;
import org.apache.arrow.driver.jdbc.utils.ArrowFlightConnectionConfigImpl.ArrowFlightConnectionProperty;
@@ -72,7 +73,11 @@ public class ArrowFlightJdbcDriver extends UnregisteredDriver {
properties.putAll(info);
if (url != null) {
- final Map<Object, Object> propertiesFromUrl = getUrlsArgs(url);
+ final Optional<Map<Object, Object>> maybeProperties = getUrlsArgs(url);
+ if (!maybeProperties.isPresent()) {
+ return null;
+ }
+ final Map<Object, Object> propertiesFromUrl = maybeProperties.get();
properties.putAll(propertiesFromUrl);
}
@@ -199,11 +204,11 @@ public class ArrowFlightJdbcDriver extends UnregisteredDriver {
* </table>
*
* @param url The url to parse.
- * @return the parsed arguments.
+ * @return the parsed arguments, or an empty optional if the driver does not handle this URL.
* @throws SQLException If an error occurs while trying to parse the URL.
*/
@VisibleForTesting // ArrowFlightJdbcDriverTest
- Map<Object, Object> getUrlsArgs(String url)
+ Optional<Map<Object, Object>> getUrlsArgs(String url)
throws SQLException {
/*
@@ -240,8 +245,7 @@ public class ArrowFlightJdbcDriver extends UnregisteredDriver {
if (!Objects.equals(uri.getScheme(), "arrow-flight") &&
!Objects.equals(uri.getScheme(), "arrow-flight-sql")) {
- throw new SQLException("URL Scheme must be 'arrow-flight'. Expected format: " +
- CONNECTION_STRING_EXPECTED);
+ return Optional.empty();
}
if (uri.getHost() == null) {
@@ -258,7 +262,7 @@ public class ArrowFlightJdbcDriver extends UnregisteredDriver {
resultMap.putAll(keyValuePairs);
}
- return resultMap;
+ return Optional.of(resultMap);
}
static Properties lowerCasePropertyKeys(final Properties properties) {
diff --git a/java/flight/flight-sql-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java b/java/flight/flight-sql-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java
index f1958b4fc8..9b8fa96d23 100644
--- a/java/flight/flight-sql-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java
+++ b/java/flight/flight-sql-jdbc-driver/src/test/java/org/apache/arrow/driver/jdbc/ArrowFlightJdbcDriverTest.java
@@ -17,9 +17,11 @@
package org.apache.arrow.driver.jdbc;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.sql.Connection;
import java.sql.Driver;
@@ -91,17 +93,15 @@ public class ArrowFlightJdbcDriverTest {
}
/**
- * Tests whether the {@link ArrowFlightJdbcDriver} fails when provided with an
+ * Tests whether the {@link ArrowFlightJdbcDriver} returns null when provided with an
* unsupported URL prefix.
- *
- * @throws SQLException If the test passes.
*/
- @Test(expected = SQLException.class)
+ @Test
public void testShouldDeclineUrlWithUnsupportedPrefix() throws Exception {
final Driver driver = new ArrowFlightJdbcDriver();
- driver.connect("jdbc:mysql://localhost:32010", dataSource.getProperties("flight", "flight123"))
- .close();
+ assertNull(driver.connect("jdbc:mysql://localhost:32010",
+ dataSource.getProperties("flight", "flight123")));
}
/**
@@ -263,7 +263,8 @@ public class ArrowFlightJdbcDriverTest {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
final Map<Object, Object> parsedArgs = driver.getUrlsArgs(
- "jdbc:arrow-flight-sql://localhost:2222/?key1=value1&key2=value2&a=b");
+ "jdbc:arrow-flight-sql://localhost:2222/?key1=value1&key2=value2&a=b")
+ .orElseThrow(() -> new RuntimeException("URL was rejected"));
// Check size == the amount of args provided (scheme not included)
assertEquals(5, parsedArgs.size());
@@ -284,7 +285,8 @@ public class ArrowFlightJdbcDriverTest {
public void testDriverUrlParsingMechanismShouldReturnTheDesiredArgsFromUrlWithSemicolon() throws Exception {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
final Map<Object, Object> parsedArgs = driver.getUrlsArgs(
- "jdbc:arrow-flight-sql://localhost:2222/;key1=value1;key2=value2;a=b");
+ "jdbc:arrow-flight-sql://localhost:2222/;key1=value1;key2=value2;a=b")
+ .orElseThrow(() -> new RuntimeException("URL was rejected"));
// Check size == the amount of args provided (scheme not included)
assertEquals(5, parsedArgs.size());
@@ -305,7 +307,8 @@ public class ArrowFlightJdbcDriverTest {
public void testDriverUrlParsingMechanismShouldReturnTheDesiredArgsFromUrlWithOneSemicolon() throws Exception {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
final Map<Object, Object> parsedArgs = driver.getUrlsArgs(
- "jdbc:arrow-flight-sql://localhost:2222/;key1=value1");
+ "jdbc:arrow-flight-sql://localhost:2222/;key1=value1")
+ .orElseThrow(() -> new RuntimeException("URL was rejected"));
// Check size == the amount of args provided (scheme not included)
assertEquals(3, parsedArgs.size());
@@ -320,16 +323,10 @@ public class ArrowFlightJdbcDriverTest {
assertEquals(parsedArgs.get("key1"), "value1");
}
- /**
- * Tests whether an exception is thrown upon attempting to connect to a
- * malformed URI.
- *
- */
@Test
- public void testDriverUrlParsingMechanismShouldThrowExceptionUponProvidedWithMalformedUrl() {
+ public void testDriverUrlParsingMechanismShouldReturnEmptyOptionalForUnknownScheme() throws SQLException {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
- assertThrows(SQLException.class, () -> driver.getUrlsArgs(
- "jdbc:malformed-url-flight://localhost:2222"));
+ assertFalse(driver.getUrlsArgs("jdbc:malformed-url-flight://localhost:2222").isPresent());
}
/**
@@ -341,7 +338,8 @@ public class ArrowFlightJdbcDriverTest {
@Test
public void testDriverUrlParsingMechanismShouldWorkWithIPAddress() throws Exception {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
- final Map<Object, Object> parsedArgs = driver.getUrlsArgs("jdbc:arrow-flight-sql://0.0.0.0:2222");
+ final Map<Object, Object> parsedArgs = driver.getUrlsArgs("jdbc:arrow-flight-sql://0.0.0.0:2222")
+ .orElseThrow(() -> new RuntimeException("URL was rejected"));
// Check size == the amount of args provided (scheme not included)
assertEquals(2, parsedArgs.size());
@@ -364,7 +362,8 @@ public class ArrowFlightJdbcDriverTest {
throws Exception {
final ArrowFlightJdbcDriver driver = new ArrowFlightJdbcDriver();
final Map<Object, Object> parsedArgs = driver.getUrlsArgs(
- "jdbc:arrow-flight-sql://0.0.0.0:2222?test1=test1value&test2%26continue=test2value&test3=test3value");
+ "jdbc:arrow-flight-sql://0.0.0.0:2222?test1=test1value&test2%26continue=test2value&test3=test3value")
+ .orElseThrow(() -> new RuntimeException("URL was rejected"));
// Check size == the amount of args provided (scheme not included)
assertEquals(5, parsedArgs.size());