From 984f9dcbc0ae2f693858f79c5c45977d06aee638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aure=CC=80le=20Nitoref?= Date: Sat, 5 Oct 2024 13:04:35 +0200 Subject: [PATCH] Skip geometry tests on MySQL(5.6). and fix tests --- quaint/src/visitor.rs | 2 +- quaint/src/visitor/mssql.rs | 20 ++++++++++++------- quaint/src/visitor/mysql.rs | 19 +++--------------- quaint/src/visitor/postgres.rs | 19 +++--------------- quaint/src/visitor/sqlite.rs | 19 +++--------------- .../tests/queries/filters/geometry_filter.rs | 12 ++++++++--- .../tests/raw/sql/typed_output.rs | 4 ++-- .../writes/data_types/native_types/mysql.rs | 2 +- .../writes/top_level_mutations/create.rs | 3 ++- 9 files changed, 37 insertions(+), 63 deletions(-) diff --git a/quaint/src/visitor.rs b/quaint/src/visitor.rs index e3e9908ac31..34e31856bde 100644 --- a/quaint/src/visitor.rs +++ b/quaint/src/visitor.rs @@ -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); diff --git a/quaint/src/visitor/mssql.rs b/quaint/src/visitor/mssql.rs index c71384ffe1d..bfee8ab9607 100644 --- a/quaint/src/visitor/mssql.rs +++ b/quaint/src/visitor/mssql.rs @@ -22,7 +22,7 @@ pub struct Mssql<'a> { order_by_set: bool, } -fn get_geometry_srid(geom: &geojson::Geometry) -> Option { +fn get_geojson_srid(geom: &geojson::Geometry) -> Option { geom.foreign_members .as_ref()? .get("crs")? @@ -37,8 +37,8 @@ fn get_geometry_srid(geom: &geojson::Geometry) -> Option { .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)) @@ -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)) } @@ -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 { diff --git a/quaint/src/visitor/mysql.rs b/quaint/src/visitor/mysql.rs index 4f36b094e72..a9b00183cf4 100644 --- a/quaint/src/visitor/mysql.rs +++ b/quaint/src/visitor/mysql.rs @@ -932,23 +932,10 @@ mod tests { #[test] fn test_raw_geometry() { - let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::().unwrap(); + let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#; + let geom = geojson.parse::().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::().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()); } diff --git a/quaint/src/visitor/postgres.rs b/quaint/src/visitor/postgres.rs index aab7ef97514..dd32af86b4c 100644 --- a/quaint/src/visitor/postgres.rs +++ b/quaint/src/visitor/postgres.rs @@ -1235,23 +1235,10 @@ mod tests { #[test] fn test_raw_geometry() { - let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::().unwrap(); + let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#; + let geom = geojson.parse::().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::().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()); } diff --git a/quaint/src/visitor/sqlite.rs b/quaint/src/visitor/sqlite.rs index 93be01f549f..b875cb28aa3 100644 --- a/quaint/src/visitor/sqlite.rs +++ b/quaint/src/visitor/sqlite.rs @@ -1076,23 +1076,10 @@ mod tests { #[test] fn test_raw_geometry() { - let geom = r#"{"type": "Point", "coordinates": [1, 2]}"#.parse::().unwrap(); + let geojson = r#"{"type":"Point","coordinates":[1.0,2.0]}"#; + let geom = geojson.parse::().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::().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()); } diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/geometry_filter.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/geometry_filter.rs index ae8f3c8aaf4..0c06ea6eb33 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/geometry_filter.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/filters/geometry_filter.rs @@ -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 } @@ -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<()> { diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs index 6edda2a7d39..73b4f5c73a7 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/raw/sql/typed_output.rs @@ -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(()) diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs index 72455f99983..7098a29d1ee 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/data_types/native_types/mysql.rs @@ -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 { diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/top_level_mutations/create.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/top_level_mutations/create.rs index 2803475fe4f..6ffb23d8eee 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/top_level_mutations/create.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/writes/top_level_mutations/create.rs @@ -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]}"}}}"#] ); @@ -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