From bda6915af072d396b6b307815e75ce9c5dc01fc2 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Tue, 24 Nov 2020 20:14:11 +0100 Subject: [PATCH 1/3] feat: allow unknown properties in connection url with lenient mode --- .../google/cloud/spanner/jdbc/JdbcDriver.java | 7 ++++- .../cloud/spanner/jdbc/JdbcDriverTest.java | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java index 65b944db..d2a2fea2 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java @@ -28,6 +28,7 @@ import java.sql.DriverPropertyInfo; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; +import java.sql.SQLWarning; import java.util.Map.Entry; import java.util.Properties; import java.util.logging.Logger; @@ -172,7 +173,11 @@ public Connection connect(String url, Properties info) throws SQLException { // Connection API String connectionUri = appendPropertiesToUrl(url.substring(5), info); ConnectionOptions options = ConnectionOptions.newBuilder().setUri(connectionUri).build(); - return new JdbcConnection(url, options); + JdbcConnection connection = new JdbcConnection(url, options); + if (options.getWarnings() != null) { + connection.pushWarning(new SQLWarning(options.getWarnings())); + } + return connection; } } catch (SpannerException e) { throw JdbcSqlExceptionFactory.of(e); diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java index 9eb10474..bd5364bc 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java @@ -161,4 +161,32 @@ public String apply(DriverPropertyInfo input) { }); assertThat(driverPropertyNames).containsExactlyElementsIn(validConnectionPropertyNames); } + + @Test + public void testLenient() throws SQLException { + // With lenient=true the driver should accept unknown properties and only generate a warning. + try (Connection connection = + DriverManager.getConnection( + String.format( + "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;lenient=true;foo=bar", + server.getPort()))) { + assertThat(connection.isClosed()).isFalse(); + assertThat((Throwable) connection.getWarnings()).isNotNull(); + assertThat(connection.getWarnings().getMessage()).contains("foo"); + } + + // Without lenient the driver should throw an exception for unknown properties. + try (Connection connection = + DriverManager.getConnection( + String.format( + "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;foo=bar", + server.getPort()))) { + fail("missing expected exception"); + } catch (SQLException e) { + assertThat((Throwable) e).isInstanceOf(JdbcSqlException.class); + JdbcSqlException jdbc = (JdbcSqlException) e; + assertThat(jdbc.getMessage()).contains("foo"); + assertThat(jdbc.getCode()).isEqualTo(Code.INVALID_ARGUMENT); + } + } } From 6f05ffda4e6a1413f176af22ef00c9185dd31948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?= Date: Tue, 24 Nov 2020 20:19:17 +0100 Subject: [PATCH 2/3] Update src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java Co-authored-by: yoshi-code-bot <70984784+yoshi-code-bot@users.noreply.github.com> --- src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java index bd5364bc..8a4829c8 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java @@ -174,7 +174,6 @@ public void testLenient() throws SQLException { assertThat((Throwable) connection.getWarnings()).isNotNull(); assertThat(connection.getWarnings().getMessage()).contains("foo"); } - // Without lenient the driver should throw an exception for unknown properties. try (Connection connection = DriverManager.getConnection( From d50e1dd90585a034e42726f21ec00418530e5850 Mon Sep 17 00:00:00 2001 From: Olav Loite Date: Wed, 25 Nov 2020 08:40:47 +0100 Subject: [PATCH 3/3] fix: add credentials to prevent the use of env credentials --- .../com/google/cloud/spanner/jdbc/JdbcDriverTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java index bd5364bc..014d9bde 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java @@ -168,19 +168,19 @@ public void testLenient() throws SQLException { try (Connection connection = DriverManager.getConnection( String.format( - "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;lenient=true;foo=bar", - server.getPort()))) { + "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;credentials=%s;lenient=true;foo=bar", + server.getPort(), TEST_KEY_PATH))) { assertThat(connection.isClosed()).isFalse(); assertThat((Throwable) connection.getWarnings()).isNotNull(); assertThat(connection.getWarnings().getMessage()).contains("foo"); } - + // Without lenient the driver should throw an exception for unknown properties. try (Connection connection = DriverManager.getConnection( String.format( - "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;foo=bar", - server.getPort()))) { + "jdbc:cloudspanner://localhost:%d/projects/p/instances/i/databases/d?usePlainText=true;credentials=%s;foo=bar", + server.getPort(), TEST_KEY_PATH))) { fail("missing expected exception"); } catch (SQLException e) { assertThat((Throwable) e).isInstanceOf(JdbcSqlException.class);