Files
wehub-resource-sync 5357c39144
Fuzzer / Run Fuzzer (push) Has been cancelled
Race tests / Go race tests (ubuntu-22.04) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:01:40 +08:00

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
}