From 658a348e9bcda8e8a115e565d85f0686212e932e Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Thu, 25 Oct 2018 10:05:41 -0700 Subject: [PATCH 1/5] fix issue for Geography.point --- src/main/java/com/microsoft/sqlserver/jdbc/Geography.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java b/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java index d8dd00929f..d35e2a8b78 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java @@ -140,7 +140,7 @@ public static Geography parse(String wkt) throws SQLServerException { * if an exception occurs */ public static Geography point(double lat, double lon, int srid) throws SQLServerException { - return new Geography("POINT (" + lat + " " + lon + ")", srid); + return new Geography("POINT (" + lon + " " + lat + ")", srid); } /** From a79b8737ef69f1bebe4ccbba788646a164009e8d Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Thu, 25 Oct 2018 10:09:14 -0700 Subject: [PATCH 2/5] change the test as well --- .../sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java index 6a95f29c9e..210184e471 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java @@ -812,7 +812,7 @@ public void testPoint() throws SQLException { String geoWKT = "POINT(1 2)"; Geometry geomWKT = Geometry.point(1, 2, 0); - Geography geogWKT = Geography.point(1, 2, 4326); + Geography geogWKT = Geography.point(2, 1, 4326); try (Connection con = (SQLServerConnection) DriverManager.getConnection(connectionString); Statement stmt = con.createStatement()) { From 093783d71519bd9081bde055677912d2cad65f23 Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Wed, 21 Nov 2018 14:34:11 -0800 Subject: [PATCH 3/5] fix getLatitude() and getLongitude() --- src/main/java/com/microsoft/sqlserver/jdbc/Geography.java | 8 ++++---- .../jdbc/datatypes/SQLServerSpatialDatatypeTest.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java b/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java index d35e2a8b78..c572ad70bd 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/Geography.java @@ -212,8 +212,8 @@ public boolean hasZ() { * @return double value that represents the latitude. */ public Double getLatitude() { - if (null != internalType && internalType == InternalSpatialDatatype.POINT && xValues.length == 1) { - return xValues[0]; + if (null != internalType && internalType == InternalSpatialDatatype.POINT && yValues.length == 1) { + return yValues[0]; } return null; } @@ -224,8 +224,8 @@ public Double getLatitude() { * @return double value that represents the longitude. */ public Double getLongitude() { - if (null != internalType && internalType == InternalSpatialDatatype.POINT && yValues.length == 1) { - return yValues[0]; + if (null != internalType && internalType == InternalSpatialDatatype.POINT && xValues.length == 1) { + return xValues[0]; } return null; } diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java index 210184e471..a31fc75b55 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java @@ -968,8 +968,8 @@ public void testGetXGetY() throws SQLException { x = geog.getLatitude(); y = geog.getLongitude(); - assertEquals(x, 1); - assertEquals(y, 2); + assertEquals(x, 2); + assertEquals(y, 1); } @Test From 171a59056aef9780e3cefac62733433d9ef161bc Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Mon, 26 Nov 2018 09:42:15 -0800 Subject: [PATCH 4/5] Adding logic to not allow rs.getGeometry against geography and vice versa. --- .../com/microsoft/sqlserver/jdbc/DDC.java | 6 +++ .../SQLServerSpatialDatatypeTest.java | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java index 845fe5b900..ee3fff262c 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java @@ -596,8 +596,14 @@ static final Object convertStreamToObject(BaseInputStream stream, TypeInfo typeI if (JDBCType.GUID == jdbcType) { return Util.readGUID(byteValue); } else if (JDBCType.GEOMETRY == jdbcType) { + if (!typeInfo.getSSTypeName().equalsIgnoreCase(jdbcType.toString())) { + DataTypes.throwConversionError(typeInfo.getSSTypeName(), jdbcType.toString()); + } return Geometry.STGeomFromWKB(byteValue); } else if (JDBCType.GEOGRAPHY == jdbcType) { + if (!typeInfo.getSSTypeName().equalsIgnoreCase(jdbcType.toString())) { + DataTypes.throwConversionError(typeInfo.getSSTypeName(), jdbcType.toString()); + } return Geography.STGeomFromWKB(byteValue); } else { String hexString = Util.bytesToHexString(byteValue, byteValue.length); diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java index a31fc75b55..fcf5378196 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java @@ -1041,6 +1041,48 @@ public void testNull() throws SQLException { } } } + + @Test + public void testWrongtype() throws SQLException { + beforeEachSetup(); + + Geometry geomWKT = Geometry.point(1, 2, 0); + Geography geogWKT = Geography.point(2, 1, 4326); + + try (Connection con = (SQLServerConnection) DriverManager.getConnection(connectionString); + Statement stmt = con.createStatement()) { + + try (SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) con.prepareStatement( + "insert into " + AbstractSQLGenerator.escapeIdentifier(geomTableName) + " values (?)");) { + pstmt.setGeometry(1, geomWKT); + pstmt.execute(); + + try { + SQLServerResultSet rs = (SQLServerResultSet) stmt.executeQuery("select * from " + AbstractSQLGenerator.escapeIdentifier(geomTableName)); + rs.next(); + rs.getGeography(1); // should fail + throw new SQLException ("getGeography against Geometry column should fail"); + } catch (SQLServerException e) { + assertEquals(e.getMessage(), "The conversion from geometry to GEOGRAPHY is unsupported."); + } + } + + try (SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) con.prepareStatement( + "insert into " + AbstractSQLGenerator.escapeIdentifier(geogTableName) + " values (?)");) { + pstmt.setGeography(1, geogWKT); + pstmt.execute(); + + try { + SQLServerResultSet rs = (SQLServerResultSet) stmt.executeQuery("select * from " + AbstractSQLGenerator.escapeIdentifier(geogTableName)); + rs.next(); + rs.getGeometry(1); // should fail + throw new SQLException ("getGeometry against Geography column should fail"); + } catch (SQLServerException e) { + assertEquals(e.getMessage(), "The conversion from geography to GEOMETRY is unsupported."); + } + } + } + } private void beforeEachSetup() throws SQLException { try (Connection con = (SQLServerConnection) DriverManager.getConnection(connectionString); From 60bb24277a1c2ad96150eb5ad9e981ac0e6d28ea Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Tue, 27 Nov 2018 16:36:27 -0800 Subject: [PATCH 5/5] resolve comments --- src/main/java/com/microsoft/sqlserver/jdbc/DDC.java | 4 ++-- .../jdbc/datatypes/SQLServerSpatialDatatypeTest.java | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java index ee3fff262c..7e18aec104 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DDC.java @@ -597,12 +597,12 @@ static final Object convertStreamToObject(BaseInputStream stream, TypeInfo typeI return Util.readGUID(byteValue); } else if (JDBCType.GEOMETRY == jdbcType) { if (!typeInfo.getSSTypeName().equalsIgnoreCase(jdbcType.toString())) { - DataTypes.throwConversionError(typeInfo.getSSTypeName(), jdbcType.toString()); + DataTypes.throwConversionError(typeInfo.getSSTypeName().toUpperCase(), jdbcType.toString()); } return Geometry.STGeomFromWKB(byteValue); } else if (JDBCType.GEOGRAPHY == jdbcType) { if (!typeInfo.getSSTypeName().equalsIgnoreCase(jdbcType.toString())) { - DataTypes.throwConversionError(typeInfo.getSSTypeName(), jdbcType.toString()); + DataTypes.throwConversionError(typeInfo.getSSTypeName().toUpperCase(), jdbcType.toString()); } return Geography.STGeomFromWKB(byteValue); } else { diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java index fcf5378196..cce188515e 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/SQLServerSpatialDatatypeTest.java @@ -4,6 +4,7 @@ */ package com.microsoft.sqlserver.jdbc.datatypes; +import static org.junit.Assert.fail; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.IOException; @@ -1061,9 +1062,9 @@ public void testWrongtype() throws SQLException { SQLServerResultSet rs = (SQLServerResultSet) stmt.executeQuery("select * from " + AbstractSQLGenerator.escapeIdentifier(geomTableName)); rs.next(); rs.getGeography(1); // should fail - throw new SQLException ("getGeography against Geometry column should fail"); + fail(); } catch (SQLServerException e) { - assertEquals(e.getMessage(), "The conversion from geometry to GEOGRAPHY is unsupported."); + assertEquals(e.getMessage(), "The conversion from GEOMETRY to GEOGRAPHY is unsupported."); } } @@ -1076,9 +1077,9 @@ public void testWrongtype() throws SQLException { SQLServerResultSet rs = (SQLServerResultSet) stmt.executeQuery("select * from " + AbstractSQLGenerator.escapeIdentifier(geogTableName)); rs.next(); rs.getGeometry(1); // should fail - throw new SQLException ("getGeometry against Geography column should fail"); + fail(); } catch (SQLServerException e) { - assertEquals(e.getMessage(), "The conversion from geography to GEOMETRY is unsupported."); + assertEquals(e.getMessage(), "The conversion from GEOGRAPHY to GEOMETRY is unsupported."); } } }