307 lines
12 KiB
Bash
307 lines
12 KiB
Bash
#!/usr/bin/env bats
|
|
load $BATS_TEST_DIRNAME/helper/common.bash
|
|
|
|
setup() {
|
|
setup_common
|
|
}
|
|
|
|
teardown() {
|
|
assert_feature_version
|
|
teardown_common
|
|
}
|
|
|
|
@test "sql-spatial-types: can make spatial types" {
|
|
run dolt sql -q "create table point_tbl (p point)"
|
|
[ "$status" -eq 0 ]
|
|
}
|
|
|
|
@test "sql-spatial-types: create point table and insert points" {
|
|
run dolt sql -q "create table point_tbl (p point)"
|
|
[ "$status" -eq 0 ]
|
|
run dolt sql -q "insert into point_tbl () values (point(1,2))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "insert into point_tbl () values (point(3,4)), (point(5,6))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "insert into point_tbl () values (point(123.456, 0.789))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "select st_aswkt(p) from point_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
[[ "$output" =~ "POINT(3 4)" ]] || false
|
|
[[ "$output" =~ "POINT(5 6)" ]] || false
|
|
[[ "$output" =~ "POINT(123.456 0.789)" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: create linestring table and insert linestrings" {
|
|
run dolt sql -q "create table line_tbl (l linestring)"
|
|
[ "$status" -eq 0 ]
|
|
run dolt sql -q "insert into line_tbl () values (linestring(point(1,2),point(3,4)))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "insert into line_tbl () values (linestring(point(1.2345, 678.9), point(111.222, 333.444), point(55.66, 77.88))), (linestring(point(1.1, 2.2),point(3.3, 4)))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "select st_aswkt(l) from line_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "LINESTRING(1 2,3 4)" ]] || false
|
|
[[ "$output" =~ "LINESTRING(1.2345 678.9,111.222 333.444,55.66 77.88)" ]] || false
|
|
[[ "$output" =~ "LINESTRING(1.1 2.2,3.3 4)" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: create polygon table and insert polygon" {
|
|
run dolt sql -q "create table poly_tbl (p polygon)"
|
|
[ "$status" -eq 0 ]
|
|
run dolt sql -q "insert into poly_tbl () values (polygon(linestring(point(1,2),point(3,4),point(5,6),point(7,8))))"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "Invalid GIS data" ]] || false
|
|
run dolt sql -q "insert into poly_tbl () values (polygon(linestring(point(1,2),point(3,4),point(5,6),point(1,2))))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "insert into poly_tbl () values (polygon(linestring(point(1,1),point(2,2),point(3,3),point(1,1)))), (polygon(linestring(point(0.123,0.456),point(1.22,1.33),point(1.11,0.99),point(0.123,0.456))))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
run dolt sql -q "select st_aswkt(p) from poly_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POLYGON((1 2,3 4,5 6,1 2))" ]] || false
|
|
[[ "$output" =~ "POLYGON((1 1,2 2,3 3,1 1))" ]] || false
|
|
[[ "$output" =~ "POLYGON((0.123 0.456,1.22 1.33,1.11 0.99,0.123 0.456))" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: can create large geometry" {
|
|
run dolt sql < $BATS_TEST_DIRNAME/helper/big_spatial.sql
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
run dolt sql -q "select count(*) from t"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "1" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: geometry survives dolt gc" {
|
|
# create geometry table
|
|
run dolt sql -q "create table geom_tbl (g geometry)"
|
|
[ "$status" -eq 0 ]
|
|
|
|
# inserting point
|
|
run dolt sql -q "insert into geom_tbl values (point(1,2))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
run dolt sql -q "select st_aswkt(g) from geom_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
|
|
run dolt gc
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "select st_aswkt(g) from geom_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: geometry survives dolt push" {
|
|
# create geometry table
|
|
run dolt sql -q "create table geom_tbl (g geometry)"
|
|
[ "$status" -eq 0 ]
|
|
|
|
# inserting point
|
|
run dolt sql -q "insert into geom_tbl values (point(1,2))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
run dolt add .
|
|
[ "$status" -eq 0 ]
|
|
run dolt commit -m "creating geometry table"
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "select st_aswkt(g) from geom_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
|
|
mkdir rem1
|
|
dolt remote add origin file://rem1
|
|
dolt push origin main
|
|
|
|
dolt clone file://rem1 repo2
|
|
cd repo2
|
|
|
|
run dolt sql -q "select st_aswkt(g) from geom_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: create geometry table and insert existing spatial types" {
|
|
|
|
# create geometry table
|
|
run dolt sql -q "create table geom_tbl (g geometry)"
|
|
[ "$status" -eq 0 ]
|
|
|
|
# inserting point
|
|
run dolt sql -q "insert into geom_tbl () values (point(1,2))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
# inserting linestring
|
|
run dolt sql -q "insert into geom_tbl () values (linestring(point(1,2),point(3,4)))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
# inserting polygon
|
|
run dolt sql -q "insert into geom_tbl () values (polygon(linestring(point(1,2),point(3,4),point(5,6),point(1,2))))"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" = "" ]] || false
|
|
|
|
# select everything
|
|
run dolt sql -q "select st_aswkt(g) from geom_tbl"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(1 2)" ]] || false
|
|
[[ "$output" =~ "LINESTRING(1 2,3 4)" ]] || false
|
|
[[ "$output" =~ "POLYGON((1 2,3 4,5 6,1 2))" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent point as primary key" {
|
|
run dolt sql -q "create table point_tbl (p point primary key)"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent linestring as primary key" {
|
|
run dolt sql -q "create table line_tbl (l linestring primary key)"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent polygon as primary key" {
|
|
run dolt sql -q "create table poly_tbl (p polygon primary key)"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent geometry as primary key" {
|
|
run dolt sql -q "create table geom_tbl (g geometry primary key)"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent altering table to use point type as primary key" {
|
|
dolt sql -q "create table point_tbl (p int primary key)"
|
|
run dolt sql -q "alter table point_tbl modify column p point primary key"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent altering table to use linestring type as primary key" {
|
|
dolt sql -q "create table line_tbl (l int primary key)"
|
|
run dolt sql -q "alter table line_tbl modify column l linestring primary key"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent altering table to use polygon type as primary key" {
|
|
dolt sql -q "create table poly_tbl (p int primary key)"
|
|
run dolt sql -q "alter table poly_tbl modify column p polygon primary key"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: prevent altering table to use geometry type as primary key" {
|
|
dolt sql -q "create table geom_tbl (g int primary key)"
|
|
run dolt sql -q "alter table geom_tbl modify column g geometry primary key"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "can't use Spatial Types as Primary Key" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: allow index on non-spatial columns of spatial table" {
|
|
dolt sql -q "create table poly_tbl (a int, p polygon)"
|
|
dolt sql -q "create index idx on poly_tbl (a)"
|
|
}
|
|
|
|
@test "sql-spatial-types: SRID defined in column definition in CREATE TABLE" {
|
|
run dolt sql -q "CREATE TABLE pt (i int primary key, p POINT NOT NULL SRID 1)"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "There's no spatial reference with SRID 1" ]] || false
|
|
|
|
run dolt sql -q "CREATE TABLE pt (i int primary key, p POINT NOT NULL SRID 0)"
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "SHOW CREATE TABLE pt"
|
|
[[ "$output" =~ "\`p\` point NOT NULL /*!80003 SRID 0 */" ]] || false
|
|
|
|
dolt sql -q "INSERT INTO pt VALUES (1, POINT(5,6))"
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM pt"
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "POINT(5 6)" ]] || false
|
|
|
|
run dolt sql -q "INSERT INTO pt VALUES (2, ST_GEOMFROMTEXT(ST_ASWKT(POINT(1,2)), 4326))"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "The SRID of the geometry does not match the SRID of the column 'p'. The SRID of the geometry is 4326, but the SRID of the column is 0. Consider changing the SRID of the geometry or the SRID property of the column." ]] || false
|
|
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM pt"
|
|
[[ ! "$output" =~ "POINT(1 2)" ]] || false
|
|
|
|
# check information_schema.ST_GEOMETRY_COLUMNS table
|
|
run dolt sql -q "select * from information_schema.ST_GEOMETRY_COLUMNS;" -r csv
|
|
[[ "$output" =~ "pt,p,\"\",0,point" ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: SRID defined in column definition in ALTER TABLE" {
|
|
run dolt sql << SQL
|
|
CREATE TABLE table1 (i int primary key, p LINESTRING NOT NULL SRID 4326);
|
|
INSERT INTO table1 VALUES (1, ST_GEOMFROMTEXT(ST_ASWKT(LINESTRING(POINT(0,0),POINT(1,2))), 4326));
|
|
SQL
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM table1"
|
|
[[ "$output" =~ "LINESTRING(0 0,1 2)" ]] || false
|
|
|
|
run dolt sql -q "ALTER TABLE table1 MODIFY COLUMN p GEOMETRY NOT NULL SRID 4326"
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "SHOW CREATE TABLE table1"
|
|
[[ "$output" =~ "\`p\` geometry NOT NULL /*!80003 SRID 4326 */" ]] || false
|
|
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM table1"
|
|
[[ "$output" =~ "LINESTRING(0 0,1 2)" ]] || false
|
|
|
|
run dolt sql -q "INSERT INTO table1 VALUES (2, ST_SRID(POINT(1,2), 4326))"
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM table1"
|
|
[[ "$output" =~ "LINESTRING(0 0,1 2)" ]] || false
|
|
[[ "$output" =~ "POINT(2 1)" ]] || false
|
|
|
|
run dolt sql -q "ALTER TABLE table1 MODIFY COLUMN p LINESTRING SRID 4326"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "Cannot get geometry object from data you sent to the GEOMETRY field" ]] || false
|
|
|
|
dolt sql -q "DELETE FROM table1 WHERE i = 1"
|
|
run dolt sql -q "SELECT ST_ASWKT(p) FROM pt"
|
|
[[ ! "$output" =~ "LINESTRING(0 0,1 2)" ]] || false
|
|
|
|
run dolt sql -q "ALTER TABLE table1 MODIFY COLUMN p POINT SRID 4326"
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "ALTER TABLE table1 MODIFY COLUMN p POINT SRID 0"
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "The SRID of the geometry does not match the SRID of the column 'p'. The SRID of the geometry is 4326, but the SRID of the column is 0. Consider changing the SRID of the geometry or the SRID property of the column." ]] || false
|
|
}
|
|
|
|
@test "sql-spatial-types: round trip dolt dump with spatial type data" {
|
|
run dolt sql << SQL
|
|
CREATE TABLE t1 (i int primary key, g GEOMETRY, p POINT, l LINESTRING, po POLYGON, mp MULTIPOINT);
|
|
INSERT INTO t1 values (0, point(1,2), point(2,1), LINESTRING(POINT(0,0),POINT(1,2)), polygon(linestring(point(1,2),point(3,4),point(5,6),point(1,2))), MULTIPOINT(POINT(0,0),POINT(1,2)));
|
|
SQL
|
|
[ "$status" -eq 0 ]
|
|
|
|
dolt dump
|
|
|
|
run dolt sql < doltdump.sql
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt sql -q "SELECT ST_AsText(g), ST_AsText(p), ST_AsText(l), ST_AsText(po), ST_AsText(mp) from t1;"
|
|
[[ "$output" =~ "POINT(1 2) | POINT(2 1) | LINESTRING(0 0,1 2) | POLYGON((1 2,3 4,5 6,1 2)) | MULTIPOINT((0 0),(1 2))" ]] || false
|
|
}
|