Skip to content

Commit

Permalink
Skip geometry tests on MySQL(5.6). and fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Oreilles committed Oct 5, 2024
1 parent fbc748e commit 984f9dc
Show file tree
Hide file tree
Showing 9 changed files with 37 additions and 63 deletions.
2 changes: 1 addition & 1 deletion quaint/src/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ pub trait Visitor<'a> {
ValueType::EnumArray(Some(variants), name) => self.visit_parameterized_enum_array(variants, name),
ValueType::Text(txt) => self.visit_parameterized_text(txt, value.native_column_type),
ValueType::Geometry(Some(geometry)) => self.visit_parameterized_geometry(geometry),
ValueType::Geography(Some(geometry)) => self.visit_parameterized_geometry(geometry),
ValueType::Geography(Some(geography)) => self.visit_parameterized_geography(geography),
ValueType::Geometry(None) | ValueType::Geography(None) => self.write("NULL"),
_ => {
self.add_parameter(value);
Expand Down
20 changes: 13 additions & 7 deletions quaint/src/visitor/mssql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pub struct Mssql<'a> {
order_by_set: bool,
}

fn get_geometry_srid(geom: &geojson::Geometry) -> Option<i32> {
fn get_geojson_srid(geom: &geojson::Geometry) -> Option<i32> {
geom.foreign_members
.as_ref()?
.get("crs")?
Expand All @@ -37,8 +37,8 @@ fn get_geometry_srid(geom: &geojson::Geometry) -> Option<i32> {
.ok()
}

fn geojson_to_wkt_srid(geometry: &geojson::Geometry) -> crate::Result<(String, i32)> {
let srid = get_geometry_srid(geometry)
fn get_wkt_srid_from_geojson(geometry: &geojson::Geometry) -> crate::Result<(String, i32)> {
let srid = get_geojson_srid(geometry)
.ok_or_else(|| Error::builder(ErrorKind::QueryInvalidInput("Invalid SRID in GeoJSON CRS".into())).build())?;
let wkt = geozero::geojson::GeoJsonString(geometry.to_string()).to_wkt()?;
Ok((wkt, srid))
Expand Down Expand Up @@ -278,12 +278,12 @@ impl<'a> Visitor<'a> for Mssql<'a> {
}

fn visit_parameterized_geometry(&mut self, geometry: geojson::Geometry) -> visitor::Result {
let (wkt, srid) = geojson_to_wkt_srid(&geometry)?;
let (wkt, srid) = get_wkt_srid_from_geojson(&geometry)?;
self.visit_function(geom_from_text(wkt, Some(srid), false))
}

fn visit_parameterized_geography(&mut self, geometry: geojson::Geometry) -> visitor::Result {
let (wkt, srid) = geojson_to_wkt_srid(&geometry)?;
let (wkt, srid) = get_wkt_srid_from_geojson(&geometry)?;
self.visit_function(geom_from_text(wkt, Some(srid), true))
}

Expand Down Expand Up @@ -455,8 +455,14 @@ impl<'a> Visitor<'a> for Mssql<'a> {
// Style 3 is keep all whitespace + internal DTD processing:
// https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15#xml-styles
ValueType::Xml(cow) => cow.map(|cow| self.write(format!("CONVERT(XML, N'{cow}', 3)"))),
ValueType::Geometry(geojson) => geojson.map(|g| self.visit_function(geom_from_geojson(g.to_string()))),
ValueType::Geography(geojson) => geojson.map(|g| self.visit_function(geom_from_geojson(g.to_string()))),
ValueType::Geometry(geojson) => geojson.map(|g| {
let (wkt, srid) = get_wkt_srid_from_geojson(&g)?;
self.visit_function(geom_from_text(wkt.raw(), Some(srid.raw()), false))
}),
ValueType::Geography(geojson) => geojson.map(|g| {
let (wkt, srid) = get_wkt_srid_from_geojson(&g)?;
self.visit_function(geom_from_text(wkt.raw(), Some(srid.raw()), false))
}),
};

match res {
Expand Down
19 changes: 3 additions & 16 deletions quaint/src/visitor/mysql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -932,23 +932,10 @@ mod tests {

#[test]
fn test_raw_geometry() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#;
let geom = geojson.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Mysql::build(Select::default().value(Value::geometry(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert!(params.is_empty());
}

#[test]
fn test_raw_geography() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Mysql::build(Select::default().value(Value::geography(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert_eq!(format!("SELECT ST_GeomFromGeoJSON('{geojson}')"), sql);
assert!(params.is_empty());
}

Expand Down
19 changes: 3 additions & 16 deletions quaint/src/visitor/postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1235,23 +1235,10 @@ mod tests {

#[test]
fn test_raw_geometry() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#;
let geom = geojson.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Postgres::build(Select::default().value(Value::geometry(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert!(params.is_empty());
}

#[test]
fn test_raw_geography() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Postgres::build(Select::default().value(Value::geography(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert_eq!(format!("SELECT ST_GeomFromGeoJSON('{geojson}')"), sql);
assert!(params.is_empty());
}

Expand Down
19 changes: 3 additions & 16 deletions quaint/src/visitor/sqlite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1076,23 +1076,10 @@ mod tests {

#[test]
fn test_raw_geometry() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#;
let geom = geojson.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Sqlite::build(Select::default().value(Value::geometry(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert!(params.is_empty());
}

#[test]
fn test_raw_geography() {
let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::<geojson::Geometry>().unwrap();
let (sql, params) = Sqlite::build(Select::default().value(Value::geography(geom).raw())).unwrap();
assert_eq!(
r#"SELECT ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}')"#,
sql
);
assert_eq!(format!("SELECT GeomFromGeoJSON('{geojson}')"), sql);
assert!(params.is_empty());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,18 @@ mod geometry_filter_spec {
Ok(())
}

#[connector_test(schema(schema), exclude(Postgres, Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm")))]
#[connector_test(
schema(schema),
exclude(Postgres, MySql(5.6), Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"))
)]
async fn basic_where(runner: Runner) -> TestResult<()> {
basic_where_test(runner).await
}

#[connector_test(schema(schema), exclude(Postgres, Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm")))]
#[connector_test(
schema(schema),
exclude(Postgres, MySql(5.6), Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"))
)]
async fn where_shorthands(runner: Runner) -> TestResult<()> {
where_shorthands_test(runner).await
}
Expand All @@ -115,7 +121,7 @@ mod geometry_filter_spec {
// see discussion here: https://github.com/prisma/prisma-engines/pull/4208#issuecomment-1828997865
#[connector_test(
schema(schema),
exclude(Postgres, Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"), MySQL("mariadb")),
exclude(Postgres, Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"), MySQL("mariadb", 5.6)),
capabilities(GeometryFiltering)
)]
async fn geometric_comparison_filters(runner: Runner) -> TestResult<()> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -441,10 +441,10 @@ mod typed_output {
}

#[connector_test(schema(generic), only(Mysql))]
async fn geometry_type_mysql(runner: Runner) -> TestResult<()> {
async fn unknown_type_mysql(runner: Runner) -> TestResult<()> {
insta::assert_snapshot!(
run_query!(&runner, fmt_query_raw(r#"SELECT POINT(1, 1);"#, vec![])),
@r###"{"data":{"queryRaw":{"columns":["POINT(1, 1)"],"types":["geometry"],"rows":[["POINT(1 1)"]]}}}"###
@r###"{"data":{"queryRaw":{"columns":["POINT(1, 1)"],"types":["geometry"],"rows":[["AAAAAAEBAAAAAAAAAAAA8D8AAAAAAADwPw=="]]}}}"###
);

Ok(())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ mod mysql {
}

// "MySQL native spatial types" should "work"
#[connector_test(schema(schema_geometry_types))]
#[connector_test(exclude(MySQL(5.6)), schema(schema_geometry_types))]
async fn native_geometry_types(runner: Runner) -> TestResult<()> {
insta::assert_snapshot!(
run_query!(&runner, r#"mutation {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ mod geometry_create {
&runner,
r#"mutation { createOneTestModel(data: { id: 1, geometry: "{\"type\":\"Point\",\"coordinates\":[1,2]}" }) { geometry }}"#,
// MongoDB excludes undefined fields
MySql(_) => vec![r#"{"data":{"createOneTestModel":{"geometry":"{\"coordinates\":[1,2],\"type\":\"Point\"}"}}}"#],
_ => vec![r#"{"data":{"createOneTestModel":{"geometry":"{\"type\":\"Point\",\"coordinates\":[1,2]}"}}}"#]
);

Expand Down Expand Up @@ -476,7 +477,7 @@ mod geometry_create {

#[connector_test(
schema(geometry_opt),
exclude(Postgres, Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"))
exclude(Postgres, MySQL(5.6), Sqlite(3, "cfd1", "libsql.js", "libsql.js.wasm"))
)]
async fn create_geometry(runner: Runner) -> TestResult<()> {
create_geometry_test(runner).await
Expand Down

0 comments on commit 984f9dc

Please sign in to comment.