Skip to content

Commit ffc43aa

Browse files
maesenkadreab8
authored andcommitted
HHH-14454 Add SpatialDialect for CockroachDB
1 parent 3a86b9b commit ffc43aa

26 files changed

+629
-62
lines changed

documentation/src/main/asciidoc/userguide/chapters/query/spatial/Spatial.adoc

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -86,42 +86,42 @@ relevant section.
8686
:no: icon:times[role="red"]
8787
[[spatial-configuration-dialect-features]]
8888
.Hibernate Spatial dialect function support
89-
[cols=",,,,,,," |options="header",]
89+
[cols=",,,,,,,," |options="header",]
9090
|================================
91-
|Function | Description | PostgresSQL | Oracle 10g/11g | MySQL | SQLServer | GeoDB (H2) | DB2
92-
|Basic functions on Geometry | | | | | | |
93-
|`int dimension(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
94-
|`String geometrytype(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
95-
|`int srid(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
96-
|`Geometry envelope(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
97-
|`String astext(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
98-
|`byte[] asbinary(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
99-
|`boolean isempty(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
100-
|`boolean issimple(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
101-
|`Geometry boundary(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}
102-
|Functions for testing Spatial Relations between geometric objects | | | | | | |
103-
|`boolean equals(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
104-
|`boolean disjoint(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
105-
|`boolean intersects(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
106-
|`boolean touches(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
107-
|`boolean crosses(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
108-
|`boolean within(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
109-
|`boolean contains(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
110-
|`boolean overlaps(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
111-
|`boolean relate(Geometry, Geometry, String)` | SFS §2.1.1.2 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}
112-
|Functions that support Spatial Analysis | | | | | | |
113-
|`double distance(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}
114-
|`Geometry buffer(Geometry, double)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}
115-
|`Geometry convexhull(Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^
116-
|`Geometry intersection(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^
117-
|`Geometry geomunion(Geometry, Geometry)` | SFS §2.1.1.3 (renamed from union) | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^
118-
|`Geometry difference(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^
119-
|`Geometry symdifference(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^
120-
|Common non-SFS functions | | | | | | |
121-
|`boolean dwithin(Geometry, Geometry, double)` | Returns true if the geometries are within the specified distance of one another | {yes} | {yes} | {no} | {no} | {yes} | {yes}
122-
|`Geometry transform(Geometry, int)` | Returns a new geometry with its coordinates transformed to the SRID referenced by the integer parameter | {yes} | {yes} | {no} | {no} | {no} | {no}
123-
|Spatial aggregate Functions | | | | | | |
124-
|`Geometry extent(Geometry)` | Returns a bounding box that bounds the set of returned geometries | {yes} | {yes} | {no} | {no} | {no} | {no}
91+
|Function | Description | PostgresSQL | Oracle 10g/11g | MySQL | SQLServer | GeoDB (H2) | DB2 | CockroachDB
92+
|Basic functions on Geometry | | | | | | | |
93+
|`int dimension(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
94+
|`String geometrytype(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
95+
|`int srid(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
96+
|`Geometry envelope(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
97+
|`String astext(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
98+
|`byte[] asbinary(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
99+
|`boolean isempty(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
100+
|`boolean issimple(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
101+
|`Geometry boundary(Geometry)` | SFS §2.1.1.1 | {yes} | {yes} | {no} | {yes} | {yes} | {yes} | {yes}
102+
|Functions for testing Spatial Relations between geometric objects | | | | | | | |
103+
|`boolean equals(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
104+
|`boolean disjoint(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
105+
|`boolean intersects(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
106+
|`boolean touches(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
107+
|`boolean crosses(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
108+
|`boolean within(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
109+
|`boolean contains(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
110+
|`boolean overlaps(Geometry, Geometry)` | SFS §2.1.1.2 | {yes} | {yes} | {yes} | {yes} | {yes} | {yes} | {yes}
111+
|`boolean relate(Geometry, Geometry, String)` | SFS §2.1.1.2 | {yes} | {yes} | {no} | {yes} | {yes} | {yes} | {yes}
112+
|Functions that support Spatial Analysis | | | | | | | |
113+
|`double distance(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes} | {yes}
114+
|`Geometry buffer(Geometry, double)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes} | {yes}
115+
|`Geometry convexhull(Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^ | {no}
116+
|`Geometry intersection(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^ | {yes}
117+
|`Geometry geomunion(Geometry, Geometry)` | SFS §2.1.1.3 (renamed from union) | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^ | {yes}
118+
|`Geometry difference(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^ | {yes}
119+
|`Geometry symdifference(Geometry, Geometry)` | SFS §2.1.1.3 | {yes} | {yes} | {no} | {yes} | {yes} | {yes}^(1)^ | {yes}
120+
|Common non-SFS functions | | | | | | | |
121+
|`boolean dwithin(Geometry, Geometry, double)` | Returns true if the geometries are within the specified distance of one another | {yes} | {yes} | {no} | {no} | {yes} | {yes} | {yes}
122+
|`Geometry transform(Geometry, int)` | Returns a new geometry with its coordinates transformed to the SRID referenced by the integer parameter | {yes} | {yes} | {no} | {no} | {no} | {no} | {yes}
123+
|Spatial aggregate Functions | | | | | | | |
124+
|`Geometry extent(Geometry)` | Returns a bounding box that bounds the set of returned geometries | {yes} | {yes} | {no} | {no} | {no} | {no} | {yes}
125125
|================================
126126
^(1)^ Argument Geometries need to have the same dimensionality.
127127

@@ -191,6 +191,14 @@ The dialect `SqlServer2008Dialect` supports the `GEOMETRY` type in SQL Server 20
191191
The `GEOGRAPHY` type is not currently supported.
192192
====
193193

194+
CockroachDB::
195+
The dialect `CockroachDB202SpatialDialect` support the `GEOMETRY` type in CockroachDB v20.2 and later.
196+
197+
[NOTE]
198+
====
199+
The `GEOGRAPHY` type is not currently supported.
200+
====
201+
194202
GeoDB (H2)::
195203
The `GeoDBDialect` supports the GeoDB a spatial extension of the H2 in-memory database.
196204
[NOTE]

gradle/databases.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,14 @@ ext {
189189
// Disable prepared statement caching due to https://www.postgresql.org/message-id/CAEcMXhmmRd4-%2BNQbnjDT26XNdUoXdmntV9zdr8%3DTu8PL9aVCYg%40mail.gmail.com
190190
'jdbc.url' : 'jdbc:postgresql://localhost:26257/defaultdb?sslmode=disable&preparedStatementCacheQueries=0'
191191
],
192+
cockroachdb_spatial : [
193+
'db.dialect' : 'org.hibernate.spatial.dialect.cockroachdb.CockroachDB202SpatialDialect',
194+
// CockroachDB uses the same pgwire protocol as PostgreSQL, so the driver is the same.
195+
'jdbc.driver': 'org.postgresql.Driver',
196+
'jdbc.user' : 'root',
197+
'jdbc.pass' : '',
198+
// Disable prepared statement caching due to https://www.postgresql.org/message-id/CAEcMXhmmRd4-%2BNQbnjDT26XNdUoXdmntV9zdr8%3DTu8PL9aVCYg%40mail.gmail.com
199+
'jdbc.url' : 'jdbc:postgresql://localhost:26257/defaultdb?sslmode=disable&preparedStatementCacheQueries=0'
200+
]
192201
]
193202
}

gradle/libraries.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ ext {
2929

3030
assertjVersion = '3.14.0'
3131

32-
geolatteVersion = '1.6.1'
32+
geolatteVersion = '1.8.0'
3333

3434
// Wildfly version targeted by module ZIP; Arquillian/Shrinkwrap versions used for CDI testing and testing the module ZIP
3535
wildflyVersion = '17.0.1.Final'
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
8+
package org.hibernate.spatial.dialect.cockroachdb;
9+
10+
import java.util.Map;
11+
12+
import org.hibernate.boot.model.TypeContributions;
13+
import org.hibernate.dialect.CockroachDB201Dialect;
14+
import org.hibernate.dialect.function.SQLFunction;
15+
import org.hibernate.service.ServiceRegistry;
16+
import org.hibernate.spatial.dialect.postgis.PGGeometryTypeDescriptor;
17+
18+
/**
19+
* An @{code SpatialDialect} for CockroachDB 20.2 and later. CockroachDB's spatial features where introduced in
20+
* that version.
21+
*/
22+
public class CockroachDB202SpatialDialect extends CockroachDB201Dialect implements CockroachSpatialDialectTrait {
23+
24+
25+
public CockroachDB202SpatialDialect() {
26+
super();
27+
registerColumnType(
28+
PGGeometryTypeDescriptor.INSTANCE_WKB_2.getSqlType(),
29+
"GEOMETRY"
30+
);
31+
for ( Map.Entry<String, SQLFunction> entry : functionsToRegister() ) {
32+
registerFunction( entry.getKey(), entry.getValue() );
33+
}
34+
}
35+
36+
@Override
37+
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
38+
super.contributeTypes(
39+
typeContributions,
40+
serviceRegistry
41+
);
42+
delegateContributeTypes( typeContributions, serviceRegistry );
43+
}
44+
45+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
8+
package org.hibernate.spatial.dialect.cockroachdb;
9+
10+
import org.hibernate.boot.model.TypeContributions;
11+
import org.hibernate.service.ServiceRegistry;
12+
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
13+
import org.hibernate.spatial.GeolatteGeometryType;
14+
import org.hibernate.spatial.JTSGeometryJavaTypeDescriptor;
15+
import org.hibernate.spatial.JTSGeometryType;
16+
import org.hibernate.spatial.SpatialDialect;
17+
import org.hibernate.spatial.dialect.postgis.PGGeometryTypeDescriptor;
18+
import org.hibernate.spatial.dialect.postgis.PostgisFunctions;
19+
import org.hibernate.spatial.dialect.postgis.PostgisSupport;
20+
21+
public class CockroachDBSpatialSupport extends PostgisSupport implements SpatialDialect {
22+
23+
CockroachDBSpatialSupport() {
24+
super( new CockroachDBSpatialFunctions() );
25+
}
26+
27+
@Override
28+
public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
29+
typeContributions.contributeType( new GeolatteGeometryType( PGGeometryTypeDescriptor.INSTANCE_WKB_2 ) );
30+
typeContributions.contributeType( new JTSGeometryType( PGGeometryTypeDescriptor.INSTANCE_WKB_2 ) );
31+
32+
typeContributions.contributeJavaTypeDescriptor( GeolatteGeometryJavaTypeDescriptor.INSTANCE );
33+
typeContributions.contributeJavaTypeDescriptor( JTSGeometryJavaTypeDescriptor.INSTANCE );
34+
}
35+
36+
}
37+
38+
class CockroachDBSpatialFunctions extends PostgisFunctions {
39+
40+
CockroachDBSpatialFunctions() {
41+
super();
42+
this.functionMap.remove( "geomunion" );
43+
}
44+
45+
}
46+
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
8+
package org.hibernate.spatial.dialect.cockroachdb;
9+
10+
import org.hibernate.boot.model.TypeContributions;
11+
import org.hibernate.service.ServiceRegistry;
12+
import org.hibernate.spatial.SpatialDialect;
13+
import org.hibernate.spatial.SpatialFunction;
14+
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
15+
16+
public interface CockroachSpatialDialectTrait extends SpatialDialect {
17+
18+
CockroachDBSpatialSupport DELEGATE = new CockroachDBSpatialSupport();
19+
20+
default SpatialFunctionsRegistry functionsToRegister() {
21+
return DELEGATE.functionsToRegister();
22+
23+
}
24+
25+
default String getSpatialRelateSQL(String columnName, int spatialRelation) {
26+
return DELEGATE.getSpatialRelateSQL( columnName, spatialRelation );
27+
}
28+
29+
default void delegateContributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
30+
DELEGATE.contributeTypes( typeContributions, serviceRegistry );
31+
}
32+
33+
/**
34+
* Returns the SQL fragment for the SQL WHERE-expression when parsing
35+
* <code>org.hibernate.spatial.criterion.SpatialFilterExpression</code>s
36+
* into prepared statements.
37+
*
38+
* @param columnName The name of the geometry-typed column to which the filter is
39+
* be applied
40+
*
41+
* @return Rhe SQL fragment for the {@code SpatialFilterExpression}
42+
*/
43+
default String getSpatialFilterExpression(String columnName) {
44+
return DELEGATE.getSpatialFilterExpression( columnName );
45+
}
46+
47+
@Override
48+
default String getSpatialAggregateSQL(String columnName, int aggregation) {
49+
return DELEGATE.getSpatialAggregateSQL( columnName, aggregation );
50+
}
51+
52+
@Override
53+
default String getDWithinSQL(String columnName) {
54+
return DELEGATE.getDWithinSQL( columnName );
55+
}
56+
57+
@Override
58+
default String getHavingSridSQL(String columnName) {
59+
return DELEGATE.getHavingSridSQL( columnName );
60+
}
61+
62+
@Override
63+
default String getIsEmptySQL(String columnName, boolean isEmpty) {
64+
return DELEGATE.getIsEmptySQL( columnName, isEmpty );
65+
}
66+
67+
@Override
68+
default boolean supportsFiltering() {
69+
return DELEGATE.supportsFiltering();
70+
}
71+
72+
@Override
73+
default boolean supports(SpatialFunction function) {
74+
return DELEGATE.supports( function );
75+
}
76+
77+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
6+
*/
7+
8+
/**
9+
* {@code SpatialDialect}s for CockroachDB
10+
*/
11+
package org.hibernate.spatial.dialect.cockroachdb;
12+
13+

hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/postgis/PGGeometryTypeDescriptor.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,18 @@
3939
public class PGGeometryTypeDescriptor implements SqlTypeDescriptor {
4040

4141

42-
/**
43-
* An instance of this class
44-
*/
45-
public static final PGGeometryTypeDescriptor INSTANCE = new PGGeometryTypeDescriptor();
42+
final private Wkb.Dialect wkbDialect;
4643

47-
public static Geometry<?> toGeometry(Object object) {
44+
// Type descriptor instance using EWKB v1 (postgis versions < 2.2.2)
45+
public static final PGGeometryTypeDescriptor INSTANCE_WKB_1 = new PGGeometryTypeDescriptor( Wkb.Dialect.POSTGIS_EWKB_1);
46+
// Type descriptor instance using EWKB v2 (postgis versions >= 2.2.2, see: https://trac.osgeo.org/postgis/ticket/3181)
47+
public static final PGGeometryTypeDescriptor INSTANCE_WKB_2 = new PGGeometryTypeDescriptor(Wkb.Dialect.POSTGIS_EWKB_2);
48+
49+
private PGGeometryTypeDescriptor(Wkb.Dialect dialect) {
50+
wkbDialect = dialect;
51+
}
52+
53+
public Geometry<?> toGeometry(Object object) {
4854
if ( object == null ) {
4955
return null;
5056
}
@@ -55,9 +61,8 @@ public static Geometry<?> toGeometry(Object object) {
5561
if ( pgValue.startsWith( "00" ) || pgValue.startsWith( "01" ) ) {
5662
//we have a WKB because this pgValue starts with the bit-order byte
5763
buffer = ByteBuffer.from( pgValue );
58-
final WkbDecoder decoder = Wkb.newDecoder( Wkb.Dialect.POSTGIS_EWKB_1 );
64+
final WkbDecoder decoder = Wkb.newDecoder( wkbDialect );
5965
return decoder.decode( buffer );
60-
6166
}
6267
else {
6368
return parseWkt( pgValue );

hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/postgis/PostgisFunctions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
* <p>
2525
* Created by Karel Maesen, Geovise BVBA on 29/10/16.
2626
*/
27-
class PostgisFunctions extends SpatialFunctionsRegistry {
27+
public class PostgisFunctions extends SpatialFunctionsRegistry {
2828

29-
PostgisFunctions() {
29+
public PostgisFunctions() {
3030

3131
put(
3232
"dimension", new StandardSQLFunction(

hibernate-spatial/src/main/java/org/hibernate/spatial/dialect/postgis/PostgisNoSQLMM.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class PostgisNoSQLMM extends PostgisDialect {
2323
public PostgisNoSQLMM() {
2424

2525
registerColumnType(
26-
PGGeometryTypeDescriptor.INSTANCE.getSqlType(),
26+
PGGeometryTypeDescriptor.INSTANCE_WKB_1.getSqlType(),
2727
"GEOMETRY"
2828
);
2929

0 commit comments

Comments
 (0)