You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by pa...@apache.org on 2026/05/13 19:27:18 UTC
(sedona-db) branch main updated: chore(ci): Port distance and predicate geography tests from s2geography and run them against BigQuery and PostGIS where possible (#816)
This is an automated email from the ASF dual-hosted git repository.
paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/sedona-db.git
The following commit(s) were added to refs/heads/main by this push:
new 24d0935fd chore(ci): Port distance and predicate geography tests from s2geography and run them against BigQuery and PostGIS where possible (#816)
24d0935fd is described below
commit 24d0935fdf6083544dcfa81dc0167f73bf4ec7ea
Author: Dewey Dunnington <de...@dunnington.ca>
AuthorDate: Wed May 13 14:27:13 2026 -0500
chore(ci): Port distance and predicate geography tests from s2geography and run them against BigQuery and PostGIS where possible (#816)
Co-authored-by: Copilot <co...@github.com>
---
c/sedona-s2geography/s2geography | 2 +-
c/sedona-s2geography/src/kernels.rs | 276 ++++-
python/sedonadb/python/sedonadb/testing.py | 14 +
python/sedonadb/tests/functions/test_functions.py | 8 +-
python/sedonadb/tests/geography/bigquery_cache.yml | 645 ++++++++++++
.../test_constructors_parsers_formatters.py | 36 +
.../tests/geography/test_geog_accessors.py | 303 +++++-
.../sedonadb/tests/geography/test_geog_distance.py | 1093 ++++++++++++++++++++
.../sedonadb/tests/geography/test_geog_measures.py | 258 ++++-
.../sedonadb/tests/geography/test_geog_overlay.py | 762 ++++++++++++++
.../tests/geography/test_geog_predicates.py | 624 ++++++++++-
python/sedonadb/tests/geography/test_geog_s2.py | 94 ++
.../tests/geography/test_geog_transformations.py | 844 ++++++++++++++-
rust/sedona-functions/src/st_points.rs | 2 +-
14 files changed, 4893 insertions(+), 68 deletions(-)
diff --git a/c/sedona-s2geography/s2geography b/c/sedona-s2geography/s2geography
index d3e091890..93206718c 160000
--- a/c/sedona-s2geography/s2geography
+++ b/c/sedona-s2geography/s2geography
@@ -1 +1 @@
-Subproject commit d3e091890ca282772a400e2c5778cedf11109fb8
+Subproject commit 93206718c825791e46253e1479ba42f39c7569da
diff --git a/c/sedona-s2geography/src/kernels.rs b/c/sedona-s2geography/src/kernels.rs
index 939f0f278..1f2c532d4 100644
--- a/c/sedona-s2geography/src/kernels.rs
+++ b/c/sedona-s2geography/src/kernels.rs
@@ -17,10 +17,17 @@
use std::sync::Arc;
-use datafusion_common::Result;
-use sedona_common::sedona_internal_datafusion_err;
-use sedona_expr::scalar_udf::ScalarKernelRef;
+use arrow_schema::DataType;
+use datafusion_common::{Result, ScalarValue};
+use datafusion_expr::ColumnarValue;
+use sedona_common::{sedona_internal_datafusion_err, sedona_internal_err};
+use sedona_expr::scalar_udf::{ScalarKernelRef, SedonaScalarKernel};
use sedona_extension::{extension::SedonaCScalarKernel, scalar_kernel::ImportedScalarKernel};
+use sedona_functions::executor::WkbBytesExecutor;
+use sedona_schema::{
+ datatypes::{SedonaType, WKB_GEOGRAPHY},
+ matchers::ArgMatcher,
+};
use crate::{s2geog_check, s2geography_c_bindgen::*};
@@ -37,7 +44,7 @@ pub fn s2_scalar_kernels() -> Result<Vec<(String, ScalarKernelRef)>> {
.map_err(|e| sedona_internal_datafusion_err!("{e}"))?;
}
- ffi_scalar_kernels
+ let mut kernels = ffi_scalar_kernels
.into_iter()
.map(|c_kernel| {
let imported_kernel = ImportedScalarKernel::try_from(c_kernel)?;
@@ -46,7 +53,213 @@ pub fn s2_scalar_kernels() -> Result<Vec<(String, ScalarKernelRef)>> {
Arc::new(imported_kernel) as ScalarKernelRef,
))
})
- .collect()
+ .collect::<Result<Vec<_>>>()?;
+
+ // A few functions need explicit NULL type matching. This is mostly a DataFusion
+ // thing (NULL can happen when binding parameters) so we handle it here and not
+ // in s2geography.
+
+ // Binary (geography, geography) -> Boolean
+ let binary_bool_fns = [
+ "st_contains",
+ "st_disjoint",
+ "st_equals",
+ "st_intersects",
+ "st_within",
+ ];
+ for fn_name in binary_bool_fns {
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ SedonaType::Arrow(DataType::Boolean),
+ ))),
+ ));
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_null(), ArgMatcher::is_geography()],
+ SedonaType::Arrow(DataType::Boolean),
+ ))),
+ ));
+ }
+
+ // Binary (geography, geography) -> Float64
+ let binary_float_fns = ["st_distance", "st_linelocatepoint", "st_maxdistance"];
+ for fn_name in binary_float_fns {
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ SedonaType::Arrow(DataType::Float64),
+ ))),
+ ));
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_null(), ArgMatcher::is_geography()],
+ SedonaType::Arrow(DataType::Float64),
+ ))),
+ ));
+ }
+
+ // Binary (geography, geography) -> geography
+ let binary_geog_fns = [
+ "st_closestpoint",
+ "st_difference",
+ "st_intersection",
+ "st_longestline",
+ "st_shortestline",
+ "st_symdifference",
+ "st_union",
+ ];
+ for fn_name in binary_geog_fns {
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_null(), ArgMatcher::is_geography()],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+ }
+
+ // Ternary (geography, geography, float64) -> Boolean
+ let ternary_bool_fns = ["st_dwithin"];
+ for fn_name in ternary_bool_fns {
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![
+ ArgMatcher::is_geography(),
+ ArgMatcher::is_null(),
+ ArgMatcher::is_numeric(),
+ ],
+ SedonaType::Arrow(DataType::Boolean),
+ ))),
+ ));
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![
+ ArgMatcher::is_null(),
+ ArgMatcher::is_geography(),
+ ArgMatcher::is_numeric(),
+ ],
+ SedonaType::Arrow(DataType::Boolean),
+ ))),
+ ));
+ kernels.push((
+ fn_name.to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![
+ ArgMatcher::is_geography(),
+ ArgMatcher::is_geography(),
+ ArgMatcher::is_null(),
+ ],
+ SedonaType::Arrow(DataType::Boolean),
+ ))),
+ ));
+ }
+
+ // st_buffer(geography, NULL) -> geography
+ kernels.push((
+ "st_buffer".to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+
+ // st_reduceprecision(geography, NULL) -> geography
+ kernels.push((
+ "st_reduceprecision".to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+
+ // st_simplify(geography, NULL) -> geography
+ kernels.push((
+ "st_simplify".to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_geography(), ArgMatcher::is_null()],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+
+ // st_buffer(geography, NULL, NULL) -> geography
+ kernels.push((
+ "st_buffer".to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![
+ ArgMatcher::is_geography(),
+ ArgMatcher::is_null(),
+ ArgMatcher::is_null(),
+ ],
+ WKB_GEOGRAPHY,
+ ))),
+ ));
+
+ // s2_coveringcellids(NULL) -> List<Int64>
+ kernels.push((
+ "s2_coveringcellids".to_string(),
+ Arc::new(NullKernelHelper::new(ArgMatcher::new(
+ vec![ArgMatcher::is_null()],
+ SedonaType::Arrow(DataType::List(Arc::new(arrow_schema::Field::new(
+ "item",
+ DataType::Int64,
+ true,
+ )))),
+ ))),
+ ));
+
+ Ok(kernels)
+}
+
+#[derive(Debug)]
+struct NullKernelHelper {
+ matcher: ArgMatcher,
+}
+
+impl NullKernelHelper {
+ fn new(matcher: ArgMatcher) -> Self {
+ Self { matcher }
+ }
+}
+
+impl SedonaScalarKernel for NullKernelHelper {
+ fn return_type(&self, args: &[SedonaType]) -> Result<Option<SedonaType>> {
+ self.matcher.match_args(args)
+ }
+
+ fn invoke_batch(
+ &self,
+ _arg_types: &[SedonaType],
+ _args: &[ColumnarValue],
+ ) -> Result<ColumnarValue> {
+ sedona_internal_err!("invoke_batch() should not be called")
+ }
+
+ fn invoke_batch_from_args(
+ &self,
+ arg_types: &[SedonaType],
+ args: &[ColumnarValue],
+ return_type: &SedonaType,
+ num_rows: usize,
+ _config_options: Option<&datafusion_common::config::ConfigOptions>,
+ ) -> Result<ColumnarValue> {
+ let executor = WkbBytesExecutor::new(arg_types, args);
+ let scalar_out = ScalarValue::try_new_null(return_type.storage_type())?;
+ executor.finish(scalar_out.to_array_of_size(num_rows)?)
+ }
}
#[cfg(test)]
@@ -71,13 +284,17 @@ mod test {
}
fn s2_udf(name: &str) -> SedonaScalarUDF {
+ let mut udf: Option<SedonaScalarUDF> = None;
for (kernel_name, kernel) in s2_scalar_kernels().unwrap() {
if name == kernel_name {
- return SedonaScalarUDF::from_impl(name, kernel);
+ match &mut udf {
+ Some(u) => u.add_kernels(kernel),
+ None => udf = Some(SedonaScalarUDF::from_impl(name, kernel)),
+ }
}
}
- panic!("Can't find s2_scalar_udf named '{name}'")
+ udf.unwrap_or_else(|| panic!("Can't find s2_scalar_udf named '{name}'"))
}
#[rstest]
@@ -395,4 +612,49 @@ mod test {
.unwrap();
tester.assert_scalar_result_equals(result, "POLYGON EMPTY");
}
+
+ #[test]
+ fn null_type_matcher() {
+ // Test that the NullKernelHelper matches arguments as intended and produces
+ // either arrays of nulls or a null scalar of the correct type.
+ let udf = s2_udf("st_intersects");
+
+ let point_array = create_array(
+ &[Some("POINT (0.25 0.25)"), Some("POINT (10 10)"), None],
+ &WKB_GEOGRAPHY,
+ );
+ let expected: ArrayRef = arrow_array::create_array!(Boolean, [None, None, None]);
+
+ // Test (geography, Null) signature
+ let tester_geog_null = ScalarUdfTester::new(
+ udf.clone().into(),
+ vec![WKB_GEOGRAPHY, SedonaType::Arrow(DataType::Null)],
+ );
+
+ let result = tester_geog_null
+ .invoke_array_scalar(point_array.clone(), ScalarValue::Null)
+ .unwrap();
+ assert_eq!(&result, &expected);
+
+ let result = tester_geog_null
+ .invoke_scalar_scalar("POINT (0 1)", ScalarValue::Null)
+ .unwrap();
+ assert_eq!(result, ScalarValue::Boolean(None));
+
+ // Test (Null, geography) signature
+ let tester_null_geog = ScalarUdfTester::new(
+ udf.into(),
+ vec![SedonaType::Arrow(DataType::Null), WKB_GEOGRAPHY],
+ );
+
+ let result = tester_null_geog
+ .invoke_scalar_array(ScalarValue::Null, point_array)
+ .unwrap();
+ assert_eq!(&result, &expected);
+
+ let result = tester_null_geog
+ .invoke_scalar_scalar(ScalarValue::Null, "POINT (0 1)")
+ .unwrap();
+ assert_eq!(result, ScalarValue::Boolean(None));
+ }
}
diff --git a/python/sedonadb/python/sedonadb/testing.py b/python/sedonadb/python/sedonadb/testing.py
index 8ca0dd930..990c5d940 100644
--- a/python/sedonadb/python/sedonadb/testing.py
+++ b/python/sedonadb/python/sedonadb/testing.py
@@ -125,6 +125,10 @@ class DBEngine:
f"Failed to create engine tester {cls.name()}: {e}\n{cls.install_hint()}"
)
+ def geography_numeric_epsilon(self) -> float:
+ """Relative numeric_epsilon to use when comparing results to the SedonaDB value"""
+ return 1e-15
+
def val_or_null(self, arg: Any) -> str:
"""Format SQL expression for a value or NULL"""
return val_or_null(arg)
@@ -470,6 +474,12 @@ class PostGIS(DBEngine):
"- Run `docker compose up postgis` to start a test PostGIS runtime"
)
+ # Use reduced precision when comparing geography to SedonaDB asserted results
+ # because PostGIS uses an ellispoidal model and SedonaDB and BigQuery use
+ # spherical ones
+ def geography_numeric_epsilon(self) -> float:
+ return 1e-2
+
def val_or_null(self, arg):
if isinstance(arg, bytes):
return f"'\\x{arg.hex()}'::bytea"
@@ -756,6 +766,10 @@ class BigQuery(DBEngine):
"- Set SEDONADB_BIGQUERY_TEST_PROJECT_ID to a valid BigQuery project identifier"
)
+ # Use slightly reduced precision because BigQuery snaps vertices on input slightly
+ def geography_numeric_epsilon(self) -> float:
+ return 1e-14
+
def val_or_null(self, arg):
if isinstance(arg, bytes):
return f"FROM_HEX('{arg.hex()}')"
diff --git a/python/sedonadb/tests/functions/test_functions.py b/python/sedonadb/tests/functions/test_functions.py
index 26406a669..95c36c0ae 100644
--- a/python/sedonadb/tests/functions/test_functions.py
+++ b/python/sedonadb/tests/functions/test_functions.py
@@ -434,7 +434,7 @@ def test_st_scale_3d(eng, geom, sx, sy, sz, expected):
def test_st_rotate(eng, geom, angle, expected):
eng = eng.create_or_skip()
query = f"SELECT ST_Rotate({geom_or_null(geom)}, {val_or_null(angle)})"
- eng.assert_query_result(query, expected, wkt_precision=1e-12)
+ eng.assert_query_result(query, expected, wkt_precision=12)
@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
@@ -449,7 +449,7 @@ def test_st_rotate(eng, geom, angle, expected):
def test_st_rotate_x(eng, geom, angle, expected):
eng = eng.create_or_skip()
query = f"SELECT ST_RotateX({geom_or_null(geom)}, {val_or_null(angle)})"
- eng.assert_query_result(query, expected, wkt_precision=1e-12)
+ eng.assert_query_result(query, expected, wkt_precision=12)
@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
@@ -464,7 +464,7 @@ def test_st_rotate_x(eng, geom, angle, expected):
def test_st_rotate_y(eng, geom, angle, expected):
eng = eng.create_or_skip()
query = f"SELECT ST_RotateY({geom_or_null(geom)}, {val_or_null(angle)})"
- eng.assert_query_result(query, expected, wkt_precision=1e-12)
+ eng.assert_query_result(query, expected, wkt_precision=12)
@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
@@ -746,7 +746,7 @@ def test_st_buffer_style_parameters(
eng.assert_query_result(
f"SELECT ST_Area(ST_Buffer({geom_or_null(geom)}, {val_or_null(dist)}, {val_or_null(buffer_style_parameters)}))",
expected_area,
- numeric_epsilon=1e-9,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
)
diff --git a/python/sedonadb/tests/geography/bigquery_cache.yml b/python/sedonadb/tests/geography/bigquery_cache.yml
index ca9808666..ae0559ddc 100644
--- a/python/sedonadb/tests/geography/bigquery_cache.yml
+++ b/python/sedonadb/tests/geography/bigquery_cache.yml
@@ -17,44 +17,689 @@
results:
bigquery:
+ SELECT S2_CellIdFromPoint(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAEP////8AAAAA
+ SELECT S2_CellIdFromPoint(ST_GeogFromText('POINT (0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACBdQCgCuIBEP////8AAAAA
+ SELECT S2_CoveringCellIds(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////7gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgAAAAHAAwAAAAQABAAAAAAAAAMFAAAABwAAAAEAAAAAQAAACQAAAADAAAAZjBfAAQABAAEAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAACAAAAAEAAAAAAAAAAQAAABpdGVtAAAAAAgADAAIAAcACAAAAAAAAAFAAAAA/////7gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAEgAAAAAAAAAAAAKABgADAAEAAgACgAAAFwAAAAQAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAA [...]
+ SELECT S2_CoveringCellIds(ST_GeogFromText('POINT (0 0)')): /////7gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgAAAAHAAwAAAAQABAAAAAAAAAMFAAAABwAAAAEAAAAAQAAACQAAAADAAAAZjBfAAQABAAEAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAACAAAAAEAAAAAAAAAAQAAABpdGVtAAAAAAgADAAIAAcACAAAAAAAAAFAAAAA/////7gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAAFwAAAAQAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAA [...]
+ SELECT S2_CoveringCellIds(ST_GeogFromText('POINT EMPTY')): /////7gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgAAAAHAAwAAAAQABAAAAAAAAAMFAAAABwAAAAEAAAAAQAAACQAAAADAAAAZjBfAAQABAAEAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAACAAAAAEAAAAAAAAAAQAAABpdGVtAAAAAAgADAAIAAcACAAAAAAAAAFAAAAA/////7gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAAFwAAAAQAAAAAQAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAA [...]
SELECT ST_Area(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Area(ST_Buffer(NULL, 100000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('LINESTRING (0 0, 1 0)'), 100000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADv1eRsCeQoQv////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POINT (0 0)'), 100000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABUKvgQ9hEdQv////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POINT (0 0)'), 100000.0, 16)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAek02J9jUdQv////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POINT (0 0)'), 100000.0, 4)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABF5yvY/YIcQv////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POINT (0 0)'), 100000.0, 8)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABUKvgQ9hEdQv////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POINT (0 1)'), NULL)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), -10000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABqYsVBAvv+Qf////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), -100000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_Buffer(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), 100000.0)): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABHSsp/T4A0Qv////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADf [...]
SELECT ST_Area(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('LINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('MULTILINESTRING ((0 0, 0 1), (1 0, 1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('MULTILINESTRING ((0 0, 1 1), (1 1, 2 2))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('MULTILINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('MULTIPOINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('MULTIPOLYGON (((0 0, 0 1, 1 0, 0 0)), ((10 10, 10 11, 11 10, 10 10)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADQ17FnSdsGQv////8AAAAA
SELECT ST_Area(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((10 10, 11 10, 11 11, 10 11, 10 10)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACixmuoX9 [...]
SELECT ST_Area(ST_GeogFromText('MULTIPOLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('POINT (5 2)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Area(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('POLYGON ((0 0, 0 1, 1 0, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADfg67CFAj3Qf////8AAAAA
+ SELECT ST_Area(ST_GeogFromText('POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABxYPRxJR0WQv////8AAAAA
SELECT ST_Area(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACBnLjOoQcHQv////8AAAAA
SELECT ST_Area(ST_GeogFromText('POLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_AsText(ST_GeogFromText('GEOMETRYCOLLECTION(POINT(0 0),POLYGON((0 0,1 0,1 1,0 1,0 0)))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAiAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAUE9M [...]
+ SELECT ST_AsText(ST_GeogFromText('POINT(1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAKAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAUE9JTlQoMSAxKQAAAAAAAP////8AAAAA
+ SELECT ST_Boundary(NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAA [...]
+ SELECT ST_Boundary(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_Boundary(ST_GeogFromText('LINESTRING (0 0, 1 1, 0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMA [...]
+ SELECT ST_Boundary(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAA [...]
+ SELECT ST_Boundary(ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAA [...]
+ SELECT ST_Boundary(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAG [...]
+ SELECT ST_Buffer(NULL, 100000.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKAB [...]
+ SELECT ST_Centroid(NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAA [...]
+ SELECT ST_Centroid(ST_GeogFromText('LINESTRING (-90 80, -90 85, 90 80)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGA [...]
SELECT ST_Centroid(ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_Centroid(ST_GeogFromText('LINESTRING (0 0, 0 1, 0 5)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMA [...]
+ SELECT ST_Centroid(ST_GeogFromText('LINESTRING EMPTY')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQ [...]
+ SELECT ST_Centroid(ST_GeogFromText('MULTIPOINT ((0 0), (0 1))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAA [...]
SELECT ST_Centroid(ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAA [...]
+ SELECT ST_Centroid(ST_GeogFromText('POINT (0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAA [...]
+ SELECT ST_Centroid(ST_GeogFromText('POINT EMPTY')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAA [...]
+ SELECT ST_Centroid(ST_GeogFromText('POLYGON ((0 0, 0 1, 1 0, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUAC [...]
SELECT ST_Centroid(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAG [...]
+ SELECT ST_Centroid(ST_GeogFromText('POLYGON EMPTY')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGA [...]
+ SELECT ST_ClosestPoint(NULL, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAK [...]
+ SELECT ST_ClosestPoint(NULL, ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5 [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (1 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5 [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (-1 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5 [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAA [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQ [...]
+ SELECT ST_ClosestPoint(ST_GeogFromText('POINT (1 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5 [...]
+ SELECT ST_Contains(NULL, NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Contains(NULL, ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Contains(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), LINESTRING
+ (40 40, 41 40), POLYGON ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (0.25
+ 0.25)'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POLYGON ((0.1 0.1, 3 0.1, 0.1 3,
+ 0.1 0.1))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('POINT (0.5 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('POINT (10 10)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('LINESTRING (0 0, 2 0)'), ST_GeogFromText('LINESTRING (0 0, 1 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('LINESTRING (0 0, 2 0)'), ST_GeogFromText('LINESTRING (10 10, 11 10)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POINT EMPTY'), NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Contains(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (0.25 0.25), LINESTRING (0.3 0.3, 0.4 0.4))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (30 30), LINESTRING (0.3 0.3, 0.4 0.4))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD// [...]
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (3 3, 4 4)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (-30 -30)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0.25 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (1.01 1.01)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0 0, 0.5 0, 0 0.5, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0.1 0.1, 3 0.1, 0.1 3, 0.1 0.1))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Contains(ST_GeogFromText('POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1
+ 0.1))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Contains(ST_GeogFromText('POLYGON ((179 0, -179 0, 179 2, 179 0))'), ST_GeogFromText('POINT (-180 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_ConvexHull(NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAE [...]
+ ? SELECT ST_ConvexHull(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_ConvexHull(ST_GeogFromText('LINESTRING (0 0, 0 1, 1 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAA [...]
+ SELECT ST_ConvexHull(ST_GeogFromText('MULTIPOINT ((0 0), (0 1), (1 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGA [...]
+ SELECT ST_ConvexHull(ST_GeogFromText('POINT (0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGA [...]
+ SELECT ST_ConvexHull(ST_GeogFromText('POLYGON ((0 0, 0 1, 1 0, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAU [...]
+ SELECT ST_ConvexHull(ST_GeogFromText('POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAA [...]
+ SELECT ST_DWithin(NULL, NULL, 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_DWithin(NULL, ST_GeogFromText('POINT EMPTY'), 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_DWithin(ST_GeogFromText('POINT (-1 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), 200000.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT (-1 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), 50000.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)'), 111195.10117748393): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)'), 50000.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT EMPTY'), 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_DWithin(ST_GeogFromText('POINT EMPTY'), NULL, 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_DWithin(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT (0 0)'), 0.0): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_DWithin(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'), 1000000.0)
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_DWithin(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'), 5000000.0)
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Difference(NULL, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKAB [...]
+ SELECT ST_Difference(NULL, ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 10, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 5, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('LINESTRING (0 0, 10 0)'), ST_GeogFromText('LINESTRING (0 10, 10 10)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('LINESTRING (2.5 0, -10 0)'), ST_GeogFromText('POLYGON ((0 -5, 5 0, 0 5, 0 -5))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('LINESTRING (2.5 0, -10 0)'), ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUA [...]
+ SELECT ST_Difference(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (180 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAA [...]
+ ? SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))'),
+ ST_GeogFromText('POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAHAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 -5, 5 0, 0 5, 0 -5))'), ST_GeogFromText('LINESTRING (2.5 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAA [...]
+ ? SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'),
+ ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('LINESTRING (0 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAA [...]
+ SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('LINESTRING (2.5 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUA [...]
+ ? SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'),
+ ST_GeogFromText('POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ ? SELECT ST_Difference(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'),
+ ST_GeogFromText('POLYGON ((170 -5, 175 -5, 175 0, 170 0, 170 -5))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Dimension(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Dimension(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), POLYGON ((0 0, 1 0, 1 1, 0 0)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD///////////////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('LINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD///////////////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP/ [...]
+ SELECT ST_Dimension(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD///////////////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_Dimension(ST_GeogFromText('POLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD///////////////8AAAAA
+ SELECT ST_Disjoint(NULL, ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Disjoint(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('LINESTRING (30 30, 31 30)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('LINESTRING (0 0, 1 1)'), ST_GeogFromText('LINESTRING (0 1, 1 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('POINT (-1 -1)'), ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('POINT (0 0)'), NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Disjoint(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Disjoint(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (-30 -30)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0.25 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Disjoint(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/// [...]
SELECT ST_Distance(NULL, NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Distance(NULL, ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), POLYGON
+ ((0 0, 1 0, 0 1, 0 0)))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (40 40),
+ POLYGON ((30 30, 31 30, 30 31, 30 30)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACLJB0GAz9RQf////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (-1 0)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1))'), ST_GeogFromText('LINESTRING (0 0.5, 1 0.5)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1))'), ST_GeogFromText('POINT (0 0)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (6 6),
+ POLYGON ((0.5 0.5, 1.5 0.5, 0.5 1.5, 0.5 0.5)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (0.25 0.25)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (-1 0.5, 3 0.5)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA [...]
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'), ST_GeogFromText('LINESTRING (0 80, 180 80)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAA+QxczkJdxQ [...]
+ ? SELECT ST_Distance(ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'), ST_GeogFromText('POLYGON
+ ((-120 90, 0 90, 120 90, -120 90))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADb5zPzBwdyQf////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (1 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAA [...]
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAA [...]
+ ? SELECT ST_Distance(ST_GeogFromText('LINESTRING (3 3, 4 4)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9urRv/S8TQf////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('LINESTRING (3 3, 4 4)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9urRv/S8TQf/ [...]
+ SELECT ST_Distance(ST_GeogFromText('POINT (-1 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 -90)'), ST_GeogFromText('POINT (0 90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (5 5), LINESTRING (0 0, 0 1))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (360 90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACmImTjgBZjQf////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0 90)'), ST_GeogFromText('LINESTRING (-90 80, 90 80)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD2hqZfzRT2Pf////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT (1 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POINT EMPTY'), NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Distance(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
? SELECT ST_Distance(ST_GeogFromText('POINT(-72.1235 42.3521)'), ST_GeogFromText('LINESTRING(-72.1260
42.45, -72.123 42.1546)'))
: /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAgCR/dct5eQP////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((-120 -80, 0 -80, 120 -80, -120
+ -80))'), ST_GeogFromText('POLYGON ((-120 80, 0 80, 120 80, -120 80))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFrQMDj/dwQf////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((-120 80, 0 80, 120 80, -120 80))'),
+ ST_GeogFromText('POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFrQMDj/dwQf////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((-120 90, 0 90, 120 90, -120 90))'),
+ ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADb5zPzBwdyQf////8AAAAA
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACLJB0GAz9RQf////8AAAAA
? SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), ST_GeogFromText('POLYGON
((5 5, 6 5, 6 6, 5 6, 5 5))'))
: /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABa/lpPTi4jQf////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (-1 0.5, 3 0.5)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA [...]
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAA [...]
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAA [...]
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (3 3, 4 4)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9urRv/S8TQf/ [...]
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON ((1 0, 3 0, 1 2, 1 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAA [...]
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1
+ 0.1))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Distance(ST_GeogFromText('POLYGON ((1 0, 3 0, 1 2, 1 0))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAA [...]
+ ? SELECT ST_Distance(ST_GeogFromText('POLYGON ((30 30, 31 30, 30 31, 30 30))'),
+ ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACLJB0GAz9RQf////8AAAAA
+ SELECT ST_EndPoint(ST_GeogFromText('LINESTRING (-122 47, -121 48, -120 49)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAF [...]
+ SELECT ST_EndPoint(ST_GeogFromText('LINESTRING (0 0, 10 10)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwA [...]
+ SELECT ST_EndPoint(ST_GeogFromText('LINESTRING (1 2, 3 4, 5 6)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMA [...]
+ SELECT ST_Equals(NULL, NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Equals(NULL, ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Equals(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0))'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Equals(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING
+ (1 1, 2 2))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING
+ (1 1, 2 2))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Equals(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING
+ (1 1, 2 2))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING
+ (1 1, 3 3))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Equals(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 0 1, 0 0)), ((10
+ 10, 11 10, 10 11, 10 10)))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POINT EMPTY'), NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Equals(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('LINESTRING EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD///// [...]
+ SELECT ST_Equals(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///// [...]
+ ? SELECT ST_Equals(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((0 0, 2 0, 0 2, 0 1, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Equals(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON ((1 0, 0 1, 0 0, 1 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD///// [...]
+ ? SELECT ST_Equals(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 32 30, 30 32, 30 30))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Equals(ST_GeogFromText('POLYGON ((179 0, -179 0, 179 1, 179 0))'),
+ ST_GeogFromText('POLYGON ((-181 0, 181 0, -181 1, -181 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Equals(ST_GeogFromText('POLYGON ((179 0, -179 0, 179 1, 179 0))'),
+ ST_GeogFromText('POLYGON ((-181 0, 181 1, -181 1, -181 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
SELECT ST_GeogPoint(1, 1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEA [...]
SELECT ST_GeogPoint(1, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADA [...]
SELECT ST_GeogPoint(1.0, 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgAD [...]
SELECT ST_GeogPoint(10, -1.5): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgAD [...]
SELECT ST_GeogPoint(NULL, 1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADA [...]
SELECT ST_GeogPoint(NULL, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABg [...]
+ SELECT ST_GeometryType(NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_GeometryType(ST_Buffer(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), 100000.0)): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAKAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAU1R [...]
+ SELECT ST_GeometryType(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAVAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAU1Rf [...]
+ SELECT ST_GeometryType(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAVAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAU1RfR2VvbWV0cnlDb2xsZWN0aW9uAAAA/// [...]
+ SELECT ST_GeometryType(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAANAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAANAAAAU1RfTGluZVN0cmluZwAAAP////8AAAAA
+ SELECT ST_GeometryType(ST_GeogFromText('MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAASAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAU1RfTXVsdGlMaW5lU3R [...]
+ SELECT ST_GeometryType(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAANAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAANAAAAU1RfTXVsdGlQb2ludAAAAP////8AAAAA
+ SELECT ST_GeometryType(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((2 2, 3 2, 3 3, 2 2)))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAPAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAPAA [...]
+ SELECT ST_GeometryType(ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAU1RfUG9pbnT/////AAAAAA==
+ SELECT ST_GeometryType(ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAVAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAU1RfR2VvbWV0cnlDb2xsZWN0aW9uAAAA/////wAAAAA=
+ SELECT ST_GeometryType(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEFEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAKAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAU1RfUG9seWdvbgAAAAAAAP////8AAAAA
+ SELECT ST_Intersection(NULL, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAK [...]
+ SELECT ST_Intersection(NULL, ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('LINESTRING (0 -5, 0 5)'), ST_GeogFromText('LINESTRING (-5 0, 5 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 10, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 5, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('LINESTRING (0 0, 10 0)'), ST_GeogFromText('LINESTRING (0 0, 10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAA [...]
+ ? SELECT ST_Intersection(ST_GeogFromText('LINESTRING (2 5, 8 5)'), ST_GeogFromText('POLYGON
+ ((0 0, 10 0, 10 10, 0 10, 0 0))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA// [...]
+ SELECT ST_Intersection(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('LINESTRING (0 0, 10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA///// [...]
+ SELECT ST_Intersection(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('POINT (10 5)'), ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('POINT (5 5)'), ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAE [...]
+ ? SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))'),
+ ST_GeogFromText('POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAGgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 -5, 5 0, 0 5, 0 -5))'), ST_GeogFromText('LINESTRING (2.5 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAA [...]
+ ? SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0
+ 0))'), ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('LINESTRING (0 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUA [...]
+ ? SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'),
+ ST_GeogFromText('LINESTRING (2.5 0, -10 0)'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ ? SELECT ST_Intersection(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'),
+ ST_GeogFromText('POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAACAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Intersects(NULL, NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Intersects(NULL, ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ ? SELECT ST_Intersects(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING
+ (1 1, 2 2))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), LINESTRING
+ (40 40, 41 41))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0.5 0.5), LINESTRING
+ (0 0, 1 0))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), LINESTRING
+ (0 0, 0 1))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 1 0), POLYGON ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (0.25
+ 0.25)'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('LINESTRING (1 0, 2 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('LINESTRING (30 30, 31 30)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0 0, 1 0)'), ST_GeogFromText('MULTIPOINT (0 0, 5 5)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0 0, 1 1)'), ST_GeogFromText('LINESTRING (0 1, 1 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'), ST_GeogFromText('POLYGON
+ ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD//// [...]
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (0 0, 1 1)'), ST_GeogFromText('MULTIPOINT (1 1, 2 2)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (0 0, 1 1)'), ST_GeogFromText('MULTIPOINT (3 3, 4 4)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (0 0, 5 5)'), ST_GeogFromText('LINESTRING (0 0, 1 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (0.25 0.25, 5 5)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD//// [...]
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (5 5, 6 6)'), ST_GeogFromText('LINESTRING (0 0, 1 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('MULTIPOINT (5 5, 6 6)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
SELECT ST_Intersects(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
SELECT ST_Intersects(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
? SELECT ST_Intersects(ST_GeogFromText('POINT (1 1)'), ST_GeogFromText('GEOMETRYCOLLECTION
(POINT (0 0), POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)), LINESTRING (0 0, 1 1))'))
: /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('POINT (5 5)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (5 5), LINESTRING (10 10, 11 10))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POINT EMPTY'), NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
SELECT ST_Intersects(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'), ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD///// [...]
? SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))'),
ST_GeogFromText('POLYGON ((5 5, 6 5, 6 6, 5 6, 5 5))'))
: /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING
+ (0.25 0.25, 0.5 0.5)'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD//// [...]
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (3 3, 4 4)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (-30 -30)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0.25 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (1.01 1.01)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/ [...]
+ ? SELECT ST_Intersects(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Intersects(ST_GeogFromText('POLYGON ((179 0, -179 0, 179 2, 179 0))'), ST_GeogFromText('POINT (-180 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD///// [...]
+ SELECT ST_IsClosed(NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_IsClosed(ST_GeogFromText('LINESTRING (0 0, 1 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsClosed(ST_GeogFromText('LINESTRING (0 0, 1 0, 1 1, 0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsClosed(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsClosed(ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsClosed(ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_IsCollection(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((2 2, 3 2, 3 3, 2 2)))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsCollection(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_IsEmpty(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('LINESTRING EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('MULTILINESTRING EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('MULTIPOINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('MULTIPOLYGON EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('POINT (0 0)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('POINT EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_IsEmpty(ST_GeogFromText('POLYGON EMPTY')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Length(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ ? SELECT ST_Length(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('LINESTRING (0 0, 0 1, 1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABA/IchKiULQf////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('LINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('MULTILINESTRING ((0 0, 0 1), (1 0, 1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAISGyesSULQf////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('POLYGON ((0 0, 0 1, 1 0, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Length(ST_GeogFromText('POLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_LineInterpolatePoint(NULL, 0.5): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAA [...]
+ SELECT ST_LineInterpolatePoint(ST_GeogFromText('LINESTRING (0 0, 0 1, 0 2)'), 0.25): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAA [...]
+ SELECT ST_LineInterpolatePoint(ST_GeogFromText('LINESTRING (0 0, 0 1, 0 2)'), 0.75): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAA [...]
+ SELECT ST_LineInterpolatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAF [...]
+ SELECT ST_LineInterpolatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), 0.5): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAF [...]
+ SELECT ST_LineInterpolatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAF [...]
+ SELECT ST_LineLocatePoint(NULL, NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_LineLocatePoint(NULL, ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 1)'), NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 1, 0 2)'), ST_GeogFromText('POINT (0 0.5)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAADQP/////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 1, 0 2)'), ST_GeogFromText('POINT (0 1.5)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAADoP/////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), ST_GeogFromText('POINT (0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAADgP/////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), ST_GeogFromText('POINT (0 2)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAADwP/////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), ST_GeogFromText('POINT (1 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_LineLocatePoint(ST_GeogFromText('LINESTRING (0 0, 0 2)'), ST_GeogFromText('POINT (1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABDT/GxnwDgP/////8AAAAA
+ SELECT ST_MaxDistance(NULL, NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_MaxDistance(NULL, ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), POLYGON
+ ((0 0, 1 0, 0 1, 0 0)))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (40 40),
+ POLYGON ((30 30, 31 30, 30 31, 30 30)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABwxFxXMe9WQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABzIFLaVWpRQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (30 30), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (-1 0)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9yZf/UdhRQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1))'), ST_GeogFromText('LINESTRING (0 0.5, 1 0.5)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACW1e1NG88mQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1))'), ST_GeogFromText('POINT (0 0)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD+34vo0PonQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('GEOMETRYCOLLECTION (POINT (6 6),
+ POLYGON ((0.5 0.5, 1.5 0.5, 0.5 1.5, 0.5 0.5)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAA54oamg8QsQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), POLYGON
+ ((0 0, 2 0, 0 2, 0 0)))'), ST_GeogFromText('POINT (0.25 0.25)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAw6mVfrscmQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (-1 0.5, 3 0.5)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD3tT+ [...]
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'), ST_GeogFromText('LINESTRING (0 80, 180 80)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgB [...]
+ ? SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'), ST_GeogFromText('POLYGON
+ ((-120 90, 0 90, 120 90, -120 90))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (0 0, 0 1)'), ST_GeogFromText('POINT (1 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABiXVUGDTIDQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'), ST_GeogFromText('POLYGON
+ ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADaqKtPs/4HQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABabo [...]
+ ? SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (3 3, 4 4)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACDVx2imIpPQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('LINESTRING (3 3, 4 4)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADhjouRLTAj [...]
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (-1 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAHNtE2RVwUQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 -90)'), ST_GeogFromText('POINT (0 90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('GEOMETRYCOLLECTION
+ (POINT (5 5), LINESTRING (0 0, 0 1))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD+34vo0PonQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSX7QP////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAJSGyesSULQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADaqKtPs/4HQf// [...]
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT (1 0)'), ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABiXVUGDTIDQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT EMPTY'), NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_MaxDistance(ST_GeogFromText('POINT EMPTY'), ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((-120 -80, 0 -80, 120 -80, -120
+ -80))'), ST_GeogFromText('POLYGON ((-120 80, 0 80, 120 80, -120 80))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((-120 80, 0 80, 120 80, -120
+ 80))'), ST_GeogFromText('POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((-120 90, 0 90, 120 90, -120
+ 90))'), ST_GeogFromText('LINESTRING (-90 -80, 90 -80)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACnImTjgBZzQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'), ST_GeogFromText('POLYGON
+ ((30 30, 31 30, 30 31, 30 30))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9yZf/UdhRQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (-1 0.5, 3 0.5)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAD3tT+ [...]
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING
+ (0.25 0.25, 0.5 0.5)'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADaqKtPs/4HQf////8AAAAA
+ SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABabo [...]
+ SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('LINESTRING (3 3, 4 4)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADhjouRLTAj [...]
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEtcDw6KoKQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POLYGON
+ ((1 0, 3 0, 1 2, 1 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACmv8IDfXcYQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5,
+ 0.1 0.1))'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEtcDw6KoKQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((1 0, 3 0, 1 2, 1 0))'), ST_GeogFromText('POLYGON
+ ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAACmv8IDfXcYQf////8AAAAA
+ ? SELECT ST_MaxDistance(ST_GeogFromText('POLYGON ((30 30, 31 30, 30 31, 30 30))'),
+ ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAB9yZf/UdhRQf////8AAAAA
+ SELECT ST_NPoints(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_NPoints(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('LINESTRING (0 0, 1 1, 2 2)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('LINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('POLYGON ((0 0, 1 0, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAP////8AAAAA
+ SELECT ST_NPoints(ST_GeogFromText('POLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_NumGeometries(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('GEOMETRYCOLLECTION EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('LINESTRING (0 0, 1 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('MULTIPOINT ((0 0), (1 1), (2 2))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAADAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAA [...]
+ SELECT ST_NumGeometries(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_NumGeometries(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAECEAAAABwAAAAEAAAAAAAAAAMAAABmMF8ACAAMAAgABwAIAAAAAAAAAUAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAA
+ SELECT ST_Perimeter(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ ? SELECT ST_Perimeter(ST_GeogFromText('GEOMETRYCOLLECTION (POINT (5 5), LINESTRING
+ (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))'))
+ : /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAC20mBS3ysXQf////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('LINESTRING (0 0, 0 1)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('LINESTRING EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('MULTIPOLYGON (((0 0, 0 1, 1 0, 0 0)), ((10 10, 10 11, 11 10, 10 10)))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABL/kVLdBQnQf////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POINT EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POLYGON ((0 0, 0 1, 1 0, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAC20mBS3ysXQf////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAADId+BWEc4rQf////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAkIvrfbSUbQf////8AAAAA
+ SELECT ST_Perimeter(ST_GeogFromText('POLYGON EMPTY')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Simplify(NULL, 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgAD [...]
+ SELECT ST_Simplify(ST_GeogFromText('LINESTRING (0 0, 10 0)'), 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAM [...]
+ SELECT ST_Simplify(ST_GeogFromText('LINESTRING (0 0, 5 1, 10 0)'), 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAU [...]
+ SELECT ST_Simplify(ST_GeogFromText('LINESTRING (0 0, 5 1, 10 0)'), 200000.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFg [...]
+ SELECT ST_Simplify(ST_GeogFromText('LINESTRING (0 0, 5 1, 10 0)'), 50000.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgA [...]
+ SELECT ST_Simplify(ST_GeogFromText('MULTIPOINT ((0 0), (0.001 0.001))'), 1000000.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAA [...]
+ SELECT ST_Simplify(ST_GeogFromText('MULTIPOINT ((0 0), (10 10))'), 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAU [...]
+ SELECT ST_Simplify(ST_GeogFromText('POINT (0 0)'), 0.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQ [...]
+ SELECT ST_Simplify(ST_GeogFromText('POINT (0 0)'), 1000000.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAA [...]
+ SELECT ST_Simplify(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAw [...]
+ SELECT ST_StartPoint(ST_GeogFromText('LINESTRING (-122 47, -121 48, -120 49)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAw [...]
+ SELECT ST_StartPoint(ST_GeogFromText('LINESTRING (0 0, 10 10)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAA [...]
+ SELECT ST_StartPoint(ST_GeogFromText('LINESTRING (1 2, 3 4, 5 6)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAA [...]
+ SELECT ST_Union(NULL, NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAA [...]
+ SELECT ST_Union(NULL, ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAG [...]
+ SELECT ST_Union(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 10, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA [...]
+ SELECT ST_Union(ST_GeogFromText('LINESTRING (0 0, 0 10)'), ST_GeogFromText('LINESTRING (0 5, 0 15)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/ [...]
+ SELECT ST_Union(ST_GeogFromText('LINESTRING (0 0, 10 0)'), ST_GeogFromText('LINESTRING (0 0, 10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/ [...]
+ SELECT ST_Union(ST_GeogFromText('LINESTRING (0 0, 10 0)'), ST_GeogFromText('LINESTRING (0 10, 10 10)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAA [...]
+ SELECT ST_Union(ST_GeogFromText('MULTIPOINT ((0 0), (1 1))'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAA [...]
+ SELECT ST_Union(ST_GeogFromText('MULTIPOINT (0 0, 1 1)'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUA [...]
+ SELECT ST_Union(ST_GeogFromText('MULTIPOINT (0 0, 1 1)'), ST_GeogFromText('POINT (2 2)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUA [...]
+ SELECT ST_Union(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAG [...]
+ SELECT ST_Union(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAw [...]
+ SELECT ST_Union(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POINT (0 1)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAw [...]
+ ? SELECT ST_Union(ST_GeogFromText('POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))'), ST_GeogFromText('POLYGON
+ ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAHAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Union(ST_GeogFromText('POLYGON ((0 -5, 5 0, 0 5, 0 -5))'), ST_GeogFromText('LINESTRING (2.5 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAE [...]
+ ? SELECT ST_Union(ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'),
+ ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Union(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('LINESTRING (0 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAA [...]
+ SELECT ST_Union(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('LINESTRING (2.5 0, -10 0)')): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAAB [...]
+ ? SELECT ST_Union(ST_GeogFromText('POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))'), ST_GeogFromText('POLYGON
+ ((10 10, 15 10, 15 15, 10 15, 10 10))'))
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAFgAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
+ SELECT ST_Within(NULL, ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Within(ST_GeogFromText('LINESTRING (0.25 0.25, 0.5 0.5)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD//// [...]
+ SELECT ST_Within(ST_GeogFromText('LINESTRING (0.25 0.25, 3 3)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POINT (-1 -1)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POINT (-180 0.25)'), ST_GeogFromText('POLYGON ((179 0, -179 0, 179 2, 179 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POINT (0 0)'), NULL): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAABAAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Within(ST_GeogFromText('POINT (0 0)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POINT (0.25 0.25)'), ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'), ST_GeogFromText('POINT (0.25 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ ? SELECT ST_Within(ST_GeogFromText('POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))'),
+ ST_GeogFromText('POLYGON ((0 0, 2 0, 0 2, 0 0))'))
+ : /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAA==
+ SELECT ST_Within(ST_GeogFromText('POLYGON ((179 0, -179 0, 179 2, 179 0))'), ST_GeogFromText('POINT (-180 0.25)')): /////3AAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEGEAAAABgAAAAEAAAAAAAAAAMAAABmMF8ABAAEAAQAAAAAAAAA/////4gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAAAgAAAAAAAAAAAAKABgADAAEAAgACgAAADwAAAAQAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAA==
+ SELECT ST_X(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_X(ST_GeogFromText('POINT (-122.5 47.3)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAKBewP////8AAAAA
+ SELECT ST_X(ST_GeogFromText('POINT (-180 -90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAIBmwP////8AAAAA
+ SELECT ST_X(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_X(ST_GeogFromText('POINT (10 20)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAkQP////8AAAAA
+ SELECT ST_X(ST_GeogFromText('POINT (180 90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAIBmQP////8AAAAA
+ SELECT ST_Y(NULL): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAAEAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAA=
+ SELECT ST_Y(ST_GeogFromText('POINT (-122.5 47.3)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABmZmZmZqZHQP////8AAAAA
+ SELECT ST_Y(ST_GeogFromText('POINT (-180 -90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAIBWwP////8AAAAA
+ SELECT ST_Y(ST_GeogFromText('POINT (0 0)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAA
+ SELECT ST_Y(ST_GeogFromText('POINT (10 20)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAA0QP////8AAAAA
+ SELECT ST_Y(ST_GeogFromText('POINT (180 90)')): /////3gAAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAUAAAAEAAUAAgABgAHAAwAAAAQABAAAAAAAAEDEAAAABwAAAAEAAAAAAAAAAMAAABmMF8AAAAGAAgABgAGAAAAAAACAAAAAAD/////iAAAABQAAAAAAAAADAAWAAYABQAIAAwADAAAAAADBAAYAAAACAAAAAAAAAAAAAoAGAAMAAQACAAKAAAAPAAAABAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAIBWQP////8AAAAA
+ SELECT st_snaptogrid(ST_GeogFromText('LINESTRING (0 0, 10 10)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUAC [...]
+ SELECT st_snaptogrid(ST_GeogFromText('LINESTRING (0.001 0.001, 10.001 10.001)'), -1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('LINESTRING (0.001 0.001, 10.001 10.001)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('LINESTRING (0.01 0.02, 0.03 0.04)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAw [...]
+ SELECT st_snaptogrid(ST_GeogFromText('MULTIPOINT ((0 0), (10 10))'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('MULTIPOINT ((0.001 0.001), (0.002 0.002))'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0 0)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0 0)'), NULL): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0.001 0.001)'), -1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0.001 0.001)'), 1.0): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0.1 0.1)'), 0.1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAA [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POINT (0.12 0.12)'), 0.1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAw [...]
+ SELECT st_snaptogrid(ST_GeogFromText('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'), -1): /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAA [...]
+ ? SELECT st_snaptogrid(ST_GeogFromText('POLYGON ((0.001 0.001, 10.001 0.001, 10.001
+ 10.001, 0.001 10.001, 0.001 0.001))'), 1.0)
+ : /////xgBAAAQAAAAAAAKAAwABgAFAAgACgAAAAABBAAMAAAACAAIAAAABAAIAAAABAAAAAEAAAAYAAAAAAASABgACAAGAAcADAAAABAAFAASAAAAAAABBRQAAAC8AAAACAAAABAAAAAAAAAAAwAAAGYwXwACAAAAVAAAAAQAAAC8////IAAAAAQAAAATAAAAeyJlbmNvZGluZyI6ICJXS1QifQAYAAAAQVJST1c6ZXh0ZW5zaW9uOm1ldGFkYXRhAAAAAAgADAAEAAgACAAAACgAAAAEAAAAGAAAAGdvb2dsZTpzcWxUeXBlOmdlb2dyYXBoeQAAAAAUAAAAQVJST1c6ZXh0ZW5zaW9uOm5hbWUAAAAABAAEAAQAAAAAAAAA/////5gAAAAUAAAAAAAAAAwAFgAGAAUACAAMAAwAAAAAAwQAGAAAADAAAAAAAAAAAAAKABgADAAEAAgACgAAAEwAAAAQAAAAAQAAAA [...]
diff --git a/python/sedonadb/tests/geography/test_constructors_parsers_formatters.py b/python/sedonadb/tests/geography/test_constructors_parsers_formatters.py
index 84fe194c2..c7a82d711 100644
--- a/python/sedonadb/tests/geography/test_constructors_parsers_formatters.py
+++ b/python/sedonadb/tests/geography/test_constructors_parsers_formatters.py
@@ -81,3 +81,39 @@ def test_st_geogpoint(eng, x, y, expected):
def test_st_asbinary(eng, geom, expected):
eng = eng.create_or_skip()
eng.assert_query_result(f"SELECT ST_AsBinary({geog_or_null(geom)})", expected)
+
+
+# BigQuery reformats its input such that it does not usually roundtrip WKT input
+@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
+@pytest.mark.parametrize(
+ "geom",
+ [
+ "POINT(1 1)",
+ "POINT EMPTY",
+ "LINESTRING(0 0,1 2,3 4)",
+ "LINESTRING EMPTY",
+ "GEOMETRYCOLLECTION(POINT(0 0),POLYGON((0 0,1 0,1 1,0 1,0 0)))",
+ ],
+)
+def test_st_astext(eng, geom):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_AsText({geog_or_null(geom)})", geom)
+
+
+# PostGIS formats its ZM slightly differently so we just test SedonaDB here
+# BigQuery does not support ZM at all
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ "geom",
+ [
+ "POINT Z EMPTY",
+ "POINT M EMPTY",
+ "POINT ZM EMPTY",
+ "POINT Z(0 1 2)",
+ "POINT M(0 1 3)",
+ "POINT ZM(0 1 2 3)",
+ ],
+)
+def test_st_astext_zm(eng, geom):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_AsText({geog_or_null(geom)})", geom)
diff --git a/python/sedonadb/tests/geography/test_geog_accessors.py b/python/sedonadb/tests/geography/test_geog_accessors.py
index 360097f5c..b18acb77a 100644
--- a/python/sedonadb/tests/geography/test_geog_accessors.py
+++ b/python/sedonadb/tests/geography/test_geog_accessors.py
@@ -27,25 +27,284 @@ if "s2geography" not in sedonadb.__features__:
@pytest.mark.parametrize(
("geog", "expected"),
[
- (None, None),
- ("POINT EMPTY", 0.0),
- ("LINESTRING EMPTY", 0.0),
- ("POLYGON EMPTY", 0.0),
- ("MULTIPOINT EMPTY", 0.0),
- ("MULTILINESTRING EMPTY", 0.0),
- ("MULTIPOLYGON EMPTY", 0.0),
- ("GEOMETRYCOLLECTION EMPTY", 0.0),
- ("POINT (5 2)", 0.0),
- ("MULTIPOINT ((0 0), (1 1))", 0.0),
- ("LINESTRING (0 0, 1 1)", 0.0),
- ("MULTILINESTRING ((0 0, 1 1), (1 1, 2 2))", 0.0),
- ("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 12364036567.076418),
- (
- "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((10 10, 11 10, 11 11, 10 11, 10 10)))",
- 24521468442.943977,
- ),
- ],
-)
-def test_st_area(eng, geog, expected):
- eng = eng.create_or_skip()
- eng.assert_query_result(f"SELECT ST_Area({geog_or_null(geog)})", expected)
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT (0 0)", 0, id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", 0, id="multipoint"),
+ pytest.param("LINESTRING (0 0, 1 1)", 1, id="linestring"),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))", 1, id="multilinestring"
+ ),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 2, id="polygon"),
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))",
+ 2,
+ id="multipolygon",
+ ),
+ # Mixed collection returns highest dimension
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ 1,
+ id="gc_point_linestring",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), POLYGON ((0 0, 1 0, 1 1, 0 0)))",
+ 2,
+ id="gc_point_polygon",
+ ),
+ ],
+)
+def test_st_dimension(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_Dimension({geog_or_null(geog)})", expected)
+
+
+# Run st_dimension empty checks separately because BigQuery doesn't distinguish
+# empties with specific geometry types. PostGIS doesn't support st_dimension()
+# for geography but does distinguish dimensions of empties for geometry and
+# returns GEOMETRYCOLLECTION EMPTY as a dimension of 0 (BigQuery returns -1).
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param("GEOMETRYCOLLECTION EMPTY", 0, id="gc_empty"),
+ pytest.param("POINT EMPTY", 0, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", 1, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", 2, id="polygon_empty"),
+ ],
+)
+def test_st_dimension_empty(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_Dimension({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT EMPTY", True, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", True, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", True, id="polygon_empty"),
+ pytest.param("MULTIPOINT EMPTY", True, id="multipoint_empty"),
+ pytest.param("MULTILINESTRING EMPTY", True, id="multilinestring_empty"),
+ pytest.param("MULTIPOLYGON EMPTY", True, id="multipolygon_empty"),
+ pytest.param("GEOMETRYCOLLECTION EMPTY", True, id="gc_empty"),
+ pytest.param("POINT (0 0)", False, id="point"),
+ pytest.param("LINESTRING (0 0, 1 1)", False, id="linestring"),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", False, id="polygon"),
+ ],
+)
+def test_st_isempty(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_IsEmpty({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT EMPTY", 0, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", 0, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", 0, id="polygon_empty"),
+ pytest.param("POINT (0 0)", 1, id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", 2, id="multipoint"),
+ pytest.param("LINESTRING (0 0, 1 1)", 2, id="linestring_2pt"),
+ pytest.param("LINESTRING (0 0, 1 1, 2 2)", 3, id="linestring_3pt"),
+ # Polygon ring: first and last vertex counted separately
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 5, id="polygon_square"),
+ pytest.param("POLYGON ((0 0, 1 0, 0 1, 0 0))", 4, id="polygon_triangle"),
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))",
+ 10,
+ id="multipolygon",
+ ),
+ ],
+)
+def test_st_npoints(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_NPoints({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT EMPTY", 0, id="point_empty"),
+ pytest.param("GEOMETRYCOLLECTION EMPTY", 0, id="gc_empty"),
+ pytest.param("POINT (0 0)", 1, id="point"),
+ pytest.param("LINESTRING (0 0, 1 1)", 1, id="linestring"),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 0))", 1, id="polygon"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", 2, id="multipoint_2"),
+ pytest.param("MULTIPOINT ((0 0), (1 1), (2 2))", 3, id="multipoint_3"),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))", 2, id="multilinestring"
+ ),
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 2, 3 2, 3 3, 2 3, 2 2)))",
+ 2,
+ id="multipolygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ 2,
+ id="gc_2geom",
+ ),
+ ],
+)
+def test_st_numgeometries(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_NumGeometries({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected_x", "expected_y"),
+ [
+ pytest.param(None, None, None, id="null"),
+ pytest.param("POINT (10 20)", 10.0, 20.0, id="point"),
+ pytest.param("POINT (-122.5 47.3)", -122.5, 47.3, id="point_negative"),
+ pytest.param("POINT (0 0)", 0.0, 0.0, id="point_origin"),
+ pytest.param("POINT (180 90)", 180.0, 90.0, id="point_max"),
+ pytest.param("POINT (-180 -90)", -180.0, -90.0, id="point_min"),
+ ],
+)
+def test_st_x_y(eng, geog, expected_x, expected_y):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_X({geog_or_null(geog)})",
+ expected_x,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+ eng.assert_query_result(
+ f"SELECT ST_Y({geog_or_null(geog)})",
+ expected_y,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT (0 0)", "ST_Point", id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", "ST_MultiPoint", id="multipoint"),
+ pytest.param("LINESTRING (0 0, 1 1)", "ST_LineString", id="linestring"),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))",
+ "ST_MultiLineString",
+ id="multilinestring",
+ ),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 0))", "ST_Polygon", id="polygon"),
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((2 2, 3 2, 3 3, 2 2)))",
+ "ST_MultiPolygon",
+ id="multipolygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ "ST_GeometryCollection",
+ id="gc",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION EMPTY", "ST_GeometryCollection", id="gc_empty"
+ ),
+ ],
+)
+def test_st_geometrytype(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_GeometryType({geog_or_null(geog)})", expected)
+
+
+# BigQuery does not propagate the geometry type of empties
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param("POINT EMPTY", "ST_Point", id="point_empty"),
+ pytest.param("LINESTRING EMPTY", "ST_LineString", id="linestring_empty"),
+ ],
+)
+def test_st_geometrytype_empty(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_GeometryType({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT EMPTY", False, id="point_empty"),
+ pytest.param("POINT (0 0)", True, id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", True, id="multipoint"),
+ # Closed linestring (ring)
+ pytest.param("LINESTRING (0 0, 1 0, 1 1, 0 0)", True, id="linestring_closed"),
+ # Open linestring
+ pytest.param("LINESTRING (0 0, 1 0, 1 1)", False, id="linestring_open"),
+ ],
+)
+def test_st_isclosed(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_IsClosed({geog_or_null(geog)})", expected)
+
+
+# BigQuery doesn't consider a Polygon closed but PostGIS and SedonaDB does for
+# geometry
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Polygon (always closed)
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 0))", True, id="polygon"),
+ ],
+)
+def test_st_isclosed_polygon(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_IsClosed({geog_or_null(geog)})", expected)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param(None, None, id="null"),
+ pytest.param("POINT EMPTY", False, id="point_empty"),
+ pytest.param("POINT (0 0)", False, id="point"),
+ pytest.param("LINESTRING (0 0, 1 1)", False, id="linestring"),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 0))", False, id="polygon"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", True, id="multipoint"),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 1 1), (2 2, 3 3))", True, id="multilinestring"
+ ),
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 1 1, 0 0)), ((2 2, 3 2, 3 3, 2 2)))",
+ True,
+ id="multipolygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ True,
+ id="gc",
+ ),
+ ],
+)
+def test_st_iscollection(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_IsCollection({geog_or_null(geog)})", expected)
+
+
+# BigQuery doesn't consider an empty geometry collection to be a collection but
+# PostGIS and SedonaDB do for geometry
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ pytest.param("GEOMETRYCOLLECTION EMPTY", True, id="gc_empty"),
+ ],
+)
+def test_st_iscollection_geometrycollection_emtpy(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(f"SELECT ST_IsCollection({geog_or_null(geog)})", expected)
diff --git a/python/sedonadb/tests/geography/test_geog_distance.py b/python/sedonadb/tests/geography/test_geog_distance.py
new file mode 100644
index 000000000..130e92848
--- /dev/null
+++ b/python/sedonadb/tests/geography/test_geog_distance.py
@@ -0,0 +1,1093 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import pytest
+import sedonadb
+from sedonadb.testing import BigQuery, SedonaDB, geog_or_null
+
+if "s2geography" not in sedonadb.__features__:
+ pytest.skip("Python package built without s2geography", allow_module_level=True)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT EMPTY", None, id="null_distance"),
+ pytest.param("POINT EMPTY", None, None, id="distance_null"),
+ pytest.param(None, None, None, id="null_distance_null"),
+ # Empties
+ pytest.param("POINT (0 0)", "POINT EMPTY", None, id="distance_empty"),
+ pytest.param("POINT EMPTY", "POINT (0 0)", None, id="empty_distance"),
+ # Point x point
+ pytest.param("POINT (0 0)", "POINT (0 0)", 0.0, id="point_distance_same_point"),
+ pytest.param(
+ "POINT (0 0)", "POINT (0 1)", 111195.10117748393, id="point_distance_point"
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (360 90)",
+ 10007559.105973553,
+ id="point_distance_wraparound_lng",
+ ),
+ # Point x linestring (point on linestring)
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 1)",
+ 0.0,
+ id="point_distance_linestring_on",
+ ),
+ # Point x linestring (point off linestring)
+ pytest.param(
+ "POINT (1 0)",
+ "LINESTRING (0 0, 0 1)",
+ 111195.10117748393,
+ id="point_distance_linestring_off",
+ ),
+ # Point x linestring (point very close to north pole)
+ pytest.param(
+ "POINT (0 90)",
+ "LINESTRING (-90 80, 90 80)",
+ 3.2132460550887776e-10,
+ id="point_distance_linestring_on_north_pole",
+ ),
+ # Linestring x point (point on linestring)
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ 0.0,
+ id="linestring_distance_point_on",
+ ),
+ # Linestring x point (point off linestring)
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ 111195.10117748393,
+ id="linestring_distance_point_off",
+ ),
+ # Point x polygon (point inside)
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="point_distance_polygon_inside",
+ ),
+ # Point x polygon (point on boundary)
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="point_distance_polygon_boundary",
+ ),
+ # Point x polygon (point outside)
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 111195.10117748393,
+ id="point_distance_polygon_outside",
+ ),
+ # Linestring x polygon (linestring fully inside)
+ pytest.param(
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="linestring_distance_polygon_inside",
+ ),
+ # Polygon x linestring (linestring fully inside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ 0.0,
+ id="polygon_distance_linestring_inside",
+ ),
+ # Linestring x polygon (linestring partially crosses boundary)
+ pytest.param(
+ "LINESTRING (0.25 0.25, 3 3)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="linestring_distance_polygon_crossing",
+ ),
+ # Polygon x linestring (linestring partially crosses boundary)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 3 3)",
+ 0.0,
+ id="polygon_distance_linestring_crossing",
+ ),
+ # Linestring x polygon (linestring crosses through, neither vertex inside)
+ pytest.param(
+ "LINESTRING (-1 0.5, 3 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="linestring_distance_polygon_through",
+ ),
+ # Polygon x linestring (linestring crosses through, neither vertex inside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (-1 0.5, 3 0.5)",
+ 0.0,
+ id="polygon_distance_linestring_through",
+ ),
+ # Linestring x polygon (linestring fully outside)
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 314367.35908786188,
+ id="linestring_distance_polygon_outside",
+ ),
+ # Polygon x linestring (linestring fully outside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (3 3, 4 4)",
+ 314367.35908786188,
+ id="polygon_distance_linestring_outside",
+ ),
+ # Polygon x polygon (one fully inside the other)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ 0.0,
+ id="polygon_distance_polygon_inside",
+ ),
+ # Polygon x polygon (one fully inside, reversed)
+ pytest.param(
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="polygon_distance_polygon_inside_rev",
+ ),
+ # Polygon x polygon (partially overlapping)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((1 0, 3 0, 1 2, 1 0))",
+ 0.0,
+ id="polygon_distance_polygon_crossing",
+ ),
+ # Polygon x polygon (partially overlapping, reversed)
+ pytest.param(
+ "POLYGON ((1 0, 3 0, 1 2, 1 0))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ id="polygon_distance_polygon_crossing_rev",
+ ),
+ # Polygon x polygon (fully outside)
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ 4520972.0955287321,
+ id="polygon_distance_polygon_outside",
+ ),
+ # Polygon x polygon (fully outside, reversed)
+ pytest.param(
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ 4520972.0955287321,
+ id="polygon_distance_polygon_outside_rev",
+ ),
+ # Polygon x polygon (north pole vs south pole)
+ pytest.param(
+ "POLYGON ((-120 80, 0 80, 120 80, -120 80))",
+ "POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))",
+ 17791216.188397426,
+ id="polygon_distance_polygon_poles",
+ ),
+ # Polygon x polygon (north pole vs south pole, reversed)
+ pytest.param(
+ "POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))",
+ "POLYGON ((-120 80, 0 80, 120 80, -120 80))",
+ 17791216.188397426,
+ id="polygon_distance_polygon_poles_rev",
+ ),
+ # Linestring x linestring (antipodal crossing)
+ pytest.param(
+ "LINESTRING (-90 -80, 90 -80)",
+ "LINESTRING (0 80, 180 80)",
+ 18446595.193179362,
+ id="linestring_distance_linestring_poles",
+ ),
+ # Linestring x polygon (antipodal crossing)
+ pytest.param(
+ "LINESTRING (-90 -80, 90 -80)",
+ "POLYGON ((-120 90, 0 90, 120 90, -120 90))",
+ 18903167.200172286,
+ id="linestring_distance_polygon_poles",
+ ),
+ # Polygon x linestring (antipodal crossing)
+ pytest.param(
+ "POLYGON ((-120 90, 0 90, 120 90, -120 90))",
+ "LINESTRING (-90 -80, 90 -80)",
+ 18903167.200172286,
+ id="polygon_distance_linestring_poles",
+ ),
+ # Point x point (antipodal crossing)
+ pytest.param(
+ "POINT (0 -90)",
+ "POINT (0 90)",
+ 20015118.21194711,
+ id="point_distance_point_poles",
+ ),
+ # GEOMETRYCOLLECTION tests
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ "POINT (0 0)",
+ 0.0,
+ id="gc_no_polygon_distance_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ 0.0,
+ id="point_distance_gc_no_polygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (0.25 0.25)",
+ 0.0,
+ id="gc_with_polygon_distance_point_inside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (-1 0)",
+ 111195.10117748393,
+ id="gc_with_polygon_distance_point_outside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ "LINESTRING (0 0.5, 1 0.5)",
+ 0.0,
+ id="gc_no_polygon_distance_linestring",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ 0.0,
+ id="gc_with_polygon_distance_linestring_inside",
+ ),
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ 314367.35908786188,
+ id="linestring_distance_gc_with_polygon_outside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "GEOMETRYCOLLECTION (POINT (6 6), POLYGON ((0.5 0.5, 1.5 0.5, 0.5 1.5, 0.5 0.5)))",
+ 0.0,
+ id="gc_distance_gc_overlapping",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), POLYGON ((0 0, 1 0, 0 1, 0 0)))",
+ "GEOMETRYCOLLECTION (POINT (40 40), POLYGON ((30 30, 31 30, 30 31, 30 30)))",
+ 4520972.0955287321,
+ id="gc_distance_gc_disjoint",
+ ),
+ ],
+)
+def test_st_distance(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Distance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "distance", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT EMPTY", 0.0, None, id="null_dwithin"),
+ pytest.param("POINT EMPTY", None, 0.0, None, id="dwithin_null"),
+ pytest.param(None, None, 0.0, None, id="null_dwithin_null"),
+ # Empties return False
+ pytest.param("POINT (0 0)", "POINT EMPTY", 0.0, False, id="dwithin_empty"),
+ pytest.param("POINT EMPTY", "POINT (0 0)", 0.0, False, id="empty_dwithin"),
+ # Point x point at exact distance
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ 111195.10117748393,
+ True,
+ id="point_dwithin_point_exact",
+ ),
+ # Point x point just under distance
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ 50000.0,
+ False,
+ id="point_not_dwithin_point",
+ ),
+ # Point inside polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 0.0,
+ True,
+ id="point_dwithin_polygon_inside",
+ ),
+ # Point outside polygon within threshold
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 200000.0,
+ True,
+ id="point_dwithin_polygon_threshold",
+ ),
+ # Point outside polygon beyond threshold
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 50000.0,
+ False,
+ id="point_not_dwithin_polygon",
+ ),
+ # Distant polygons within threshold
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ 5000000.0,
+ True,
+ id="polygon_dwithin_polygon_threshold",
+ ),
+ # Distant polygons beyond threshold
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ 1000000.0,
+ False,
+ id="polygon_not_dwithin_polygon",
+ ),
+ ],
+)
+def test_st_dwithin(eng, geom1, geom2, distance, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_DWithin({geog_or_null(geom1)}, {geog_or_null(geom2)}, {distance})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT EMPTY", None, id="null_max_distance"),
+ pytest.param("POINT EMPTY", None, None, id="max_distance_null"),
+ pytest.param(None, None, None, id="null_max_distance_null"),
+ # Empties
+ pytest.param("POINT (0 0)", "POINT EMPTY", None, id="max_distance_empty"),
+ pytest.param("POINT EMPTY", "POINT (0 0)", None, id="empty_max_distance"),
+ # Point x point (same point)
+ pytest.param(
+ "POINT (0 0)", "POINT (0 0)", 0.0, id="point_max_distance_same_point"
+ ),
+ # Point x point
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ 111195.10117748393,
+ id="point_max_distance_point",
+ ),
+ # Point x linestring (point on linestring)
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 1)",
+ 111195.10117748393,
+ id="point_max_distance_linestring_on",
+ ),
+ # Point x linestring (point off linestring)
+ pytest.param(
+ "POINT (1 0)",
+ "LINESTRING (0 0, 0 1)",
+ 157249.62809250789,
+ id="point_max_distance_linestring_off",
+ ),
+ # Linestring x point (point on linestring)
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ 111195.10117748393,
+ id="linestring_max_distance_point_on",
+ ),
+ # Linestring x point (point off linestring)
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ 157249.62809250789,
+ id="linestring_max_distance_point_off",
+ ),
+ # Point x polygon (point inside)
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 196566.41390163341,
+ id="point_max_distance_polygon_inside",
+ ),
+ # Point x polygon (point on boundary)
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 222390.20235496786,
+ id="point_max_distance_polygon_boundary",
+ ),
+ # Point x polygon (point outside)
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 333585.3035324518,
+ id="point_max_distance_polygon_outside",
+ ),
+ # Linestring x polygon (linestring fully inside)
+ pytest.param(
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 196566.41390163341,
+ id="linestring_max_distance_polygon_inside",
+ ),
+ # Polygon x linestring (linestring fully inside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ 196566.41390163341,
+ id="polygon_max_distance_linestring_inside",
+ ),
+ # Linestring x polygon (linestring partially crosses boundary)
+ pytest.param(
+ "LINESTRING (0.25 0.25, 3 3)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 471653.02881023812,
+ id="linestring_max_distance_polygon_crossing",
+ ),
+ # Polygon x linestring (linestring partially crosses boundary)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 3 3)",
+ 471653.02881023812,
+ id="polygon_max_distance_linestring_crossing",
+ ),
+ # Linestring x polygon (linestring crosses through, neither vertex inside)
+ pytest.param(
+ "LINESTRING (-1 0.5, 3 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 372880.15844616242,
+ id="linestring_max_distance_polygon_through",
+ ),
+ # Polygon x linestring (linestring crosses through, neither vertex inside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (-1 0.5, 3 0.5)",
+ 372880.15844616242,
+ id="polygon_max_distance_linestring_through",
+ ),
+ # Linestring x polygon (linestring fully outside)
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 628758.78426786896,
+ id="linestring_max_distance_polygon_outside",
+ ),
+ # Polygon x linestring (linestring fully outside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (3 3, 4 4)",
+ 628758.78426786896,
+ id="polygon_max_distance_linestring_outside",
+ ),
+ # Polygon x polygon (one fully inside the other)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ 218461.11755505961,
+ id="polygon_max_distance_polygon_inside",
+ ),
+ # Polygon x polygon (one fully inside, reversed)
+ pytest.param(
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 218461.11755505961,
+ id="polygon_max_distance_polygon_inside_rev",
+ ),
+ # Polygon x polygon (partially overlapping)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((1 0, 3 0, 1 2, 1 0))",
+ 400863.2536725945,
+ id="polygon_max_distance_polygon_crossing",
+ ),
+ # Polygon x polygon (partially overlapping, reversed)
+ pytest.param(
+ "POLYGON ((1 0, 3 0, 1 2, 1 0))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ 400863.2536725945,
+ id="polygon_max_distance_polygon_crossing_rev",
+ ),
+ # Polygon x polygon (fully outside)
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ 4677959.9936393471,
+ id="polygon_max_distance_polygon_outside",
+ ),
+ # Polygon x polygon (fully outside, reversed)
+ pytest.param(
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ 4677959.9936393471,
+ id="polygon_max_distance_polygon_outside_rev",
+ ),
+ # Polygon x polygon (north pole vs south pole)
+ pytest.param(
+ "POLYGON ((-120 80, 0 80, 120 80, -120 80))",
+ "POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))",
+ 20015118.21194711,
+ id="polygon_max_distance_polygon_poles",
+ ),
+ # Polygon x polygon (north pole vs south pole, reversed)
+ pytest.param(
+ "POLYGON ((-120 -80, 0 -80, 120 -80, -120 -80))",
+ "POLYGON ((-120 80, 0 80, 120 80, -120 80))",
+ 20015118.21194711,
+ id="polygon_max_distance_polygon_poles_rev",
+ ),
+ # Linestring x polygon (antipodal crossing)
+ pytest.param(
+ "LINESTRING (-90 -80, 90 -80)",
+ "POLYGON ((-120 90, 0 90, 120 90, -120 90))",
+ 20015118.21194711,
+ id="linestring_max_distance_polygon_poles",
+ ),
+ # Polygon x linestring (antipodal crossing)
+ pytest.param(
+ "POLYGON ((-120 90, 0 90, 120 90, -120 90))",
+ "LINESTRING (-90 -80, 90 -80)",
+ 20015118.21194711,
+ id="polygon_max_distance_linestring_poles",
+ ),
+ # Point x point (antipodal crossing)
+ pytest.param(
+ "POINT (0 -90)",
+ "POINT (0 90)",
+ 20015118.21194711,
+ id="point_max_distance_point_poles",
+ ),
+ # GEOMETRYCOLLECTION tests
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ "POINT (0 0)",
+ 785768.45419216133,
+ id="gc_no_polygon_max_distance_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ 785768.45419216133,
+ id="point_max_distance_gc_no_polygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (0.25 0.25)",
+ 746455.18632442318,
+ id="gc_with_polygon_max_distance_point_inside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (-1 0)",
+ 4677959.9936393471,
+ id="gc_with_polygon_max_distance_point_outside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1))",
+ "LINESTRING (0 0.5, 1 0.5)",
+ 747405.65220515686,
+ id="gc_no_polygon_max_distance_linestring",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ 4565335.4112626193,
+ id="gc_with_polygon_max_distance_linestring_inside",
+ ),
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ 4134193.266520442,
+ id="linestring_max_distance_gc_with_polygon_outside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "GEOMETRYCOLLECTION (POINT (6 6), POLYGON ((0.5 0.5, 1.5 0.5, 0.5 1.5, 0.5 0.5)))",
+ 942657.82524783083,
+ id="gc_max_distance_gc_overlapping",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), POLYGON ((0 0, 1 0, 0 1, 0 0)))",
+ "GEOMETRYCOLLECTION (POINT (40 40), POLYGON ((30 30, 31 30, 30 31, 30 30)))",
+ 6012101.3650370687,
+ id="gc_max_distance_gc_disjoint",
+ ),
+ ],
+)
+def test_st_max_distance(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_MaxDistance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# Separate test for an antipodal linestring pair because we need a wider tolerance
+# for BigQuery here but it's an important case to capture
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Linestring x linestring (antipodal crossing)
+ pytest.param(
+ "LINESTRING (-90 -80, 90 -80)",
+ "LINESTRING (0 80, 180 80)",
+ 20015118.022076216,
+ id="linestring_max_distance_linestring_poles",
+ ),
+ ],
+)
+def test_st_max_distance_antipodal_linestring(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_MaxDistance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ numeric_epsilon=1e-8,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Empties with ZM
+ pytest.param(
+ "POINT ZM (0 0 0 0)", "POINT ZM EMPTY", None, id="distance_empty_zm"
+ ),
+ pytest.param(
+ "POINT ZM EMPTY", "POINT ZM (0 0 0 0)", None, id="empty_distance_zm"
+ ),
+ # Point ZM x point ZM
+ pytest.param(
+ "POINT ZM (0 0 1 2)",
+ "POINT ZM (0 1 2 3)",
+ 111195.10117748393,
+ id="point_distance_point_zm",
+ ),
+ # Point Z x point Z
+ pytest.param(
+ "POINT Z (0 0 1)",
+ "POINT Z (0 1 2)",
+ 111195.10117748393,
+ id="point_distance_point_z",
+ ),
+ # Point M x point M
+ pytest.param(
+ "POINT M (0 0 2)",
+ "POINT M (0 1 3)",
+ 111195.10117748393,
+ id="point_distance_point_m",
+ ),
+ # Z Point x polygon (point inside)
+ pytest.param(
+ "POINT Z (0.25 0.25 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 0.0,
+ id="point_z_distance_polygon_inside",
+ ),
+ # Z Point x polygon (point on boundary)
+ pytest.param(
+ "POINT Z (0 0 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 0.0,
+ id="point_z_distance_polygon_boundary",
+ ),
+ # Z Point x polygon (point outside)
+ pytest.param(
+ "POINT Z (-1 0 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 111195.10117748393,
+ id="point_z_distance_polygon_outside",
+ ),
+ ],
+)
+def test_st_distance_zm(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Distance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Z Point x polygon (point inside)
+ pytest.param(
+ "POINT Z (0.25 0.25 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 196566.41390163341,
+ id="point_z_max_distance_polygon_inside",
+ ),
+ # Z Point x polygon (point on boundary)
+ pytest.param(
+ "POINT Z (0 0 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 222390.20235496786,
+ id="point_z_max_distance_polygon_boundary",
+ ),
+ # Z Point x polygon (point outside)
+ pytest.param(
+ "POINT Z (-1 0 10)",
+ "POLYGON Z ((0 0 12, 2 0 12, 0 2 12, 0 0 12))",
+ 333585.3035324518,
+ id="point_z_max_distance_polygon_outside",
+ ),
+ ],
+)
+def test_st_max_distance_zm(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_MaxDistance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# ST_ClosestPoint tests - finds the closest point on geom1 to geom2
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_closestpoint"),
+ pytest.param("POINT (0 0)", None, None, id="closestpoint_null"),
+ pytest.param(None, None, None, id="null_closestpoint_null"),
+ # Point x Point
+ pytest.param(
+ "POINT (0 0)", "POINT (0 0)", "POINT (0 0)", id="point_same_point"
+ ),
+ pytest.param(
+ "POINT (0 0)", "POINT (0 1)", "POINT (0 0)", id="point_different_point"
+ ),
+ # Point x Linestring
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ id="point_on_linestring",
+ ),
+ pytest.param(
+ "POINT (1 0)",
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ id="point_off_linestring",
+ ),
+ # Linestring x Point
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ "POINT (0 0)",
+ id="linestring_point_on",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ "POINT (0 0)",
+ id="linestring_point_off",
+ ),
+ # Point x Polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0.25 0.25)",
+ id="point_inside_polygon",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0 0)",
+ id="point_on_polygon_boundary",
+ ),
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (-1 0)",
+ id="point_outside_polygon",
+ ),
+ ],
+)
+def test_st_closestpoint(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ClosestPoint({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties - BigQuery doesn't return POINT EMPTY consistently
+# Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT (0 0)", "POINT EMPTY", "POINT (nan nan)", id="closestpoint_empty"
+ ),
+ pytest.param(
+ "POINT EMPTY", "POINT (0 0)", "POINT (nan nan)", id="empty_closestpoint"
+ ),
+ ],
+)
+def test_st_closestpoint_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ClosestPoint({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# ST_ShortestLine tests (not supported on BigQuery)
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_shortestline"),
+ pytest.param("POINT (0 0)", None, None, id="shortestline_null"),
+ pytest.param(None, None, None, id="null_shortestline_null"),
+ # Point x Point
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 0)",
+ id="point_same_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ "LINESTRING (0 0, 0 1)",
+ id="point_different_point",
+ ),
+ # Point x Linestring
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 1)",
+ "LINESTRING (0 0, 0 0)",
+ id="point_on_linestring",
+ ),
+ pytest.param(
+ "POINT (1 0)",
+ "LINESTRING (0 0, 0 1)",
+ "LINESTRING (1 0, 0 0)",
+ id="point_off_linestring",
+ ),
+ # Linestring x Point
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 0)",
+ id="linestring_point_on",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ "LINESTRING (0 0, 1 0)",
+ id="linestring_point_off",
+ ),
+ # Point x Polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 0.25 0.25)",
+ id="point_inside_polygon",
+ ),
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (-1 0, 0 0)",
+ id="point_outside_polygon",
+ ),
+ # Linestring x Polygon
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (3 3, 0.998247 1.00221)",
+ id="linestring_outside_polygon",
+ ),
+ ],
+)
+def test_st_shortestline(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ShortestLine({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties - BigQuery doesn't return LINESTRING EMPTY consistently
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "LINESTRING EMPTY",
+ id="shortestline_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "LINESTRING EMPTY",
+ id="empty_shortestline",
+ ),
+ ],
+)
+def test_st_shortestline_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ShortestLine({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# ST_LongestLine tests (not supported on BigQuery)
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_longestline"),
+ pytest.param("POINT (0 0)", None, None, id="longestline_null"),
+ pytest.param(None, None, None, id="null_longestline_null"),
+ # Point x Point
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 0)",
+ id="point_same_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ "LINESTRING (0 0, 0 1)",
+ id="point_different_point",
+ ),
+ # Point x Linestring
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 0 1)",
+ "LINESTRING (0 0, 0 1)",
+ id="point_on_linestring",
+ ),
+ pytest.param(
+ "POINT (1 0)",
+ "LINESTRING (0 0, 0 1)",
+ "LINESTRING (1 0, 0 1)",
+ id="point_off_linestring",
+ ),
+ # Linestring x Point
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (0 0)",
+ "LINESTRING (0 1, 0 0)",
+ id="linestring_point_on",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1)",
+ "POINT (1 0)",
+ "LINESTRING (0 1, 1 0)",
+ id="linestring_point_off",
+ ),
+ # Point x Polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 2 0)",
+ id="point_inside_polygon",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0 0, 2 0)",
+ id="point_on_polygon_boundary",
+ ),
+ pytest.param(
+ "POINT (-1 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (-1 0, 2 0)",
+ id="point_outside_polygon",
+ ),
+ # Linestring x Polygon
+ pytest.param(
+ "LINESTRING (3 3, 4 4)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (4 4, 0 0)",
+ id="linestring_outside_polygon",
+ ),
+ ],
+)
+def test_st_longestline(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LongestLine({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties - BigQuery doesn't return LINESTRING EMPTY consistently
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "LINESTRING EMPTY",
+ id="longestline_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "LINESTRING EMPTY",
+ id="empty_longestline",
+ ),
+ ],
+)
+def test_st_longestline_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LongestLine({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
diff --git a/python/sedonadb/tests/geography/test_geog_measures.py b/python/sedonadb/tests/geography/test_geog_measures.py
index bcf232295..a42042e04 100644
--- a/python/sedonadb/tests/geography/test_geog_measures.py
+++ b/python/sedonadb/tests/geography/test_geog_measures.py
@@ -16,38 +16,256 @@
# under the License.
import pytest
-from sedonadb.testing import BigQuery, PostGIS, SedonaDB, geog_or_null
import sedonadb
+from sedonadb.testing import BigQuery, SedonaDB, PostGIS, geog_or_null
if "s2geography" not in sedonadb.__features__:
pytest.skip("Python package built without s2geography", allow_module_level=True)
-@pytest.mark.parametrize("eng", [SedonaDB, PostGIS, BigQuery])
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
@pytest.mark.parametrize(
- ("geom1", "geom2", "expected"),
+ ("geog", "expected"),
[
- (None, None, None),
- # Single arg nulls are not handled by SedonaDB until upgrade
- # ("POINT (0 0)", None, None),
- # (None, "POINT (0 0)", None),
- ("POINT (0 0)", "POINT (0 0)", 0),
- (
- "POINT(-72.1235 42.3521)",
- "LINESTRING(-72.1260 42.45, -72.123 42.1546)",
- 123.47576072749062, # 123.80207675
- ),
- (
- "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
- "POLYGON ((5 5, 6 5, 6 6, 5 6, 5 5))",
- 628519.1549911008, # 627129.50261075
+ # Nulls
+ pytest.param(None, None, id="null_area"),
+ # Empties
+ pytest.param("POINT EMPTY", 0.0, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", 0.0, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", 0.0, id="polygon_empty"),
+ # Points (zero area)
+ pytest.param("POINT (0 0)", 0.0, id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", 0.0, id="multipoint"),
+ # Linestrings (zero area)
+ pytest.param("LINESTRING (0 0, 0 1)", 0.0, id="linestring"),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 0 1), (1 0, 1 1))", 0.0, id="multilinestring"
+ ),
+ # Polygons
+ pytest.param(
+ "POLYGON ((0 0, 0 1, 1 0, 0 0))", 6182489130.9071951, id="triangle"
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 12364036567.076418, id="square"
+ ),
+ # Multipolygon
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 0 1, 1 0, 0 0)), ((10 10, 10 11, 11 10, 10 10)))",
+ 12271037686.230379,
+ id="multipolygon",
+ ),
+ # Polygon with hole
+ pytest.param(
+ "POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))",
+ 23744568445.094166,
+ id="polygon_with_hole",
+ ),
+ # GeometryCollection (area from polygon only)
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))",
+ 6182489130.9071951,
+ id="geometrycollection",
+ ),
+ ],
+)
+def test_st_area(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Area({geog_or_null(geog)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Nulls
+ pytest.param(None, None, id="null_length"),
+ # Empties
+ pytest.param("POINT EMPTY", 0.0, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", 0.0, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", 0.0, id="polygon_empty"),
+ # Points (zero length)
+ pytest.param("POINT (0 0)", 0.0, id="point"),
+ pytest.param("MULTIPOINT ((0 0), (1 1))", 0.0, id="multipoint"),
+ # Linestrings
+ pytest.param(
+ "LINESTRING (0 0, 0 1)", 111195.10117748393, id="linestring_one_segment"
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 1 1)",
+ 222373.26637265272,
+ id="linestring_two_segments",
+ ),
+ pytest.param(
+ "MULTILINESTRING ((0 0, 0 1), (1 0, 1 1))",
+ 222390.20235496786,
+ id="multilinestring",
+ ),
+ # Polygons (zero length — perimeter is separate)
+ pytest.param("POLYGON ((0 0, 0 1, 1 0, 0 0))", 0.0, id="triangle"),
+ pytest.param("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 0.0, id="square"),
+ ],
+)
+def test_st_length(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Length({geog_or_null(geog)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# We have to skip PostGIS and BigQuery for the geometrycollection check:
+# PostGIS includes the polygon perimeter (https://trac.osgeo.org/postgis/ticket/6076)
+# and BigQuery incorrectly returns 0.
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # GeometryCollection (length from linestring only)
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))",
+ 111195.10117748393,
+ id="geometrycollection",
+ ),
+ ],
+)
+def test_st_length_geometrycollection(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Length({geog_or_null(geog)})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Empties
+ pytest.param("POINT EMPTY", 0.0, id="point_empty"),
+ pytest.param("LINESTRING EMPTY", 0.0, id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", 0.0, id="polygon_empty"),
+ # Points (zero perimeter)
+ pytest.param("POINT (0 0)", 0.0, id="point"),
+ # Linestrings (zero perimeter)
+ pytest.param("LINESTRING (0 0, 0 1)", 0.0, id="linestring"),
+ # Polygons
+ pytest.param(
+ "POLYGON ((0 0, 0 1, 1 0, 0 0))", 379639.83044747578, id="triangle"
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", 444763.46872762055, id="square"
+ ),
+ # Multipolygon
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 0 1, 1 0, 0 0)), ((10 10, 10 11, 11 10, 10 10)))",
+ 756282.14701838186,
+ id="multipolygon",
+ ),
+ # Polygon with hole
+ pytest.param(
+ "POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))",
+ 911112.66968130425,
+ id="polygon_with_hole",
+ ),
+ ],
+)
+def test_st_perimeter(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Perimeter({geog_or_null(geog)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# We have to skip PostGIS for the geometrycollection check:
+# PostGIS includes the linestring length (https://trac.osgeo.org/postgis/ticket/6076)
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # GeometryCollection (perimeter from polygon only)
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))",
+ 379639.83044747578,
+ id="geometrycollection",
+ ),
+ ],
+)
+def test_st_perimeter_geometrycollection(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Perimeter({geog_or_null(geog)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("line", "point", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_line"),
+ pytest.param("LINESTRING (0 0, 0 1)", None, None, id="null_point"),
+ pytest.param(None, None, None, id="null_both"),
+ # Endpoints and midpoints
+ pytest.param("LINESTRING (0 0, 0 2)", "POINT (0 0)", 0.0, id="start"),
+ pytest.param("LINESTRING (0 0, 0 2)", "POINT (0 2)", 1.0, id="end"),
+ pytest.param("LINESTRING (0 0, 0 2)", "POINT (0 1)", 0.5, id="midpoint"),
+ # Multi-segment line
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 2)",
+ "POINT (0 0.5)",
+ 0.25,
+ id="multi_seg_quarter",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 2)",
+ "POINT (0 1.5)",
+ 0.75,
+ id="multi_seg_three_quarter",
+ ),
+ # Point off the line (projects to nearest)
+ pytest.param("LINESTRING (0 0, 0 2)", "POINT (1 0)", 0.0, id="off_line_start"),
+ pytest.param(
+ "LINESTRING (0 0, 0 2)",
+ "POINT (1 1)",
+ 0.50007614855210425,
+ id="off_line_mid",
+ ),
+ ],
+)
+def test_st_line_locate_point(eng, line, point, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LineLocatePoint({geog_or_null(line)}, {geog_or_null(point)})",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# BigQuery doesn't support degenerate cases
+@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
+@pytest.mark.parametrize(
+ ("line", "point", "expected"),
+ [
+ pytest.param("LINESTRING EMPTY", "POINT (0 0)", None, id="empty_line"),
+ pytest.param("LINESTRING (0 1, 2 3)", "POINT EMPTY", None, id="empty_point"),
+ # Degenerate
+ pytest.param(
+ "LINESTRING (1 1, 1 1)", "POINT (0 0)", 0.0, id="zero_length_line"
),
],
)
-def test_st_distance(eng, geom1, geom2, expected):
+def test_st_line_locate_point_degenerate(eng, line, point, expected):
eng = eng.create_or_skip()
eng.assert_query_result(
- f"SELECT ST_Distance({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ f"SELECT ST_LineLocatePoint({geog_or_null(line)}, {geog_or_null(point)})",
expected,
- numeric_epsilon=1e-2,
)
diff --git a/python/sedonadb/tests/geography/test_geog_overlay.py b/python/sedonadb/tests/geography/test_geog_overlay.py
new file mode 100644
index 000000000..0705845c7
--- /dev/null
+++ b/python/sedonadb/tests/geography/test_geog_overlay.py
@@ -0,0 +1,762 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import pytest
+import sedonadb
+from sedonadb.testing import BigQuery, SedonaDB, geog_or_null
+
+if "s2geography" not in sedonadb.__features__:
+ pytest.skip("Python package built without s2geography", allow_module_level=True)
+
+
+# ST_Intersection tests
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_intersection"),
+ pytest.param("POINT (0 0)", None, None, id="intersection_null"),
+ pytest.param(None, None, None, id="null_intersection_null"),
+ # Point + Point: same
+ pytest.param("POINT (0 0)", "POINT (0 0)", "POINT (0 0)", id="point_same"),
+ # Multipoint + Point: overlap
+ pytest.param(
+ "MULTIPOINT ((0 0), (1 1))",
+ "POINT (0 0)",
+ "POINT (0 0)",
+ id="multipoint_point_overlap",
+ ),
+ # Linestring + Linestring: same
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ id="linestring_same",
+ ),
+ # Linestring + Linestring: crossing (intersection is a point)
+ pytest.param(
+ "LINESTRING (0 -5, 0 5)",
+ "LINESTRING (-5 0, 5 0)",
+ "POINT (0 0)",
+ id="linestring_crossing",
+ ),
+ # Linestring + Linestring: touching
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 10, 0 15)",
+ "POINT (0 10)",
+ id="linestring_touching",
+ ),
+ # Linestring + Polygon: touching
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (0 0, -10 0)",
+ "POINT (0 0)",
+ id="linestring_touching_polygon",
+ ),
+ # Linestring + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 0, 0 5, 0 -5))",
+ "LINESTRING (2.5 0, -10 0)",
+ "LINESTRING (2.5 0, 0 0)",
+ id="linestring_overlapping_polygon",
+ ),
+ # Polygon + Polygon: same
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="polygon_same",
+ ),
+ # Point + Linestring: point at endpoint
+ pytest.param(
+ "POINT (0 0)",
+ "LINESTRING (0 0, 10 0)",
+ "POINT (0 0)",
+ id="point_on_linestring",
+ ),
+ # Point + Polygon: point inside
+ pytest.param(
+ "POINT (5 5)",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POINT (5 5)",
+ id="point_inside_polygon",
+ ),
+ # Point + Polygon: point on boundary
+ pytest.param(
+ "POINT (10 5)",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POINT (10 5)",
+ id="point_on_polygon_boundary",
+ ),
+ # Linestring + Polygon: line inside
+ pytest.param(
+ "LINESTRING (2 5, 8 5)",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "LINESTRING (2 5, 8 5)",
+ id="linestring_inside_polygon",
+ ),
+ # Polygon + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))",
+ "POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))",
+ "POLYGON ((0 2.502379, 0 -2.502379, 2.5 -2.5, 2.5 2.5, 0 2.502379))",
+ id="polygon_overlapping_polygon",
+ ),
+ ],
+)
+def test_st_intersection(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Intersection({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties - BigQuery doesn't return specific empty types consistently
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT EMPTY",
+ "POINT EMPTY",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="both_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="empty_a_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="empty_b_point",
+ ),
+ pytest.param(
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="empty_a_polygon",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="empty_b_polygon",
+ ),
+ ],
+)
+def test_st_intersection_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Intersection({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Results that return EMPTY - BigQuery differs in handling
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Linestring + Linestring: disjoint
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 10, 10 10)",
+ "LINESTRING EMPTY",
+ id="linestring_disjoint",
+ ),
+ # Polygon + Polygon: disjoint
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))",
+ "POLYGON EMPTY",
+ id="polygon_disjoint",
+ ),
+ # Linestring + Polygon: line outside
+ pytest.param(
+ "LINESTRING (20 0, 30 0)",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "LINESTRING EMPTY",
+ id="linestring_outside_polygon",
+ ),
+ ],
+)
+def test_st_intersection_returns_empty(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Intersection({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Results that return POINT (nan nan) - BigQuery differs in handling
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Point + Point: different
+ # Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+ pytest.param(
+ "POINT (0 0)", "POINT (0 1)", "POINT (nan nan)", id="point_different"
+ ),
+ # Multipoint + Point: disjoint
+ pytest.param(
+ "MULTIPOINT ((0 0), (1 1))",
+ "POINT (2 2)",
+ "POINT (nan nan)",
+ id="multipoint_point_disjoint",
+ ),
+ # Point + Linestring: point off line
+ pytest.param(
+ "POINT (5 5)",
+ "LINESTRING (0 0, 10 0)",
+ "POINT (nan nan)",
+ id="point_off_linestring",
+ ),
+ # Point + Polygon: point outside
+ pytest.param(
+ "POINT (20 20)",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POINT (nan nan)",
+ id="point_outside_polygon",
+ ),
+ ],
+)
+def test_st_intersection_returns_empty_point(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Intersection({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# ST_Difference tests
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_difference"),
+ pytest.param("POINT (0 0)", None, None, id="difference_null"),
+ pytest.param(None, None, None, id="null_difference_null"),
+ # Point - Point: different
+ pytest.param("POINT (0 0)", "POINT (0 1)", "POINT (0 0)", id="point_different"),
+ # Linestring - Linestring: disjoint
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 10, 10 10)",
+ "LINESTRING (0 0, 10 0)",
+ id="linestring_disjoint",
+ ),
+ # Polygon - Polygon: disjoint
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))",
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ id="polygon_disjoint",
+ ),
+ # Linestring + Linestring: touching
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 10, 0 15)",
+ "LINESTRING (0 0, 0 10)",
+ id="linestring_touching",
+ ),
+ # Polygon - Linestring: touching
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (0 0, -10 0)",
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ id="linestring_touching_polygon",
+ ),
+ # Polygon - Linestring: overlapping edge
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (2.5 0, -10 0)",
+ "POLYGON ((0 0, 2.5 0, 5 0, 5 5, 0 5, 0 0))",
+ id="polygon_overlapping_linestring_edge",
+ ),
+ # Polygon - Linestring: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 0, 0 5, 0 -5))",
+ "LINESTRING (2.5 0, -10 0)",
+ "POLYGON ((0 -5, 5 0, 0 5, 0 0, 0 -5))",
+ id="polygon_overlapping_linestring",
+ ),
+ # Linestring - Polygon: overlapping
+ pytest.param(
+ "LINESTRING (2.5 0, -10 0)",
+ "POLYGON ((0 -5, 5 0, 0 5, 0 -5))",
+ "LINESTRING (0 0, -10 0)",
+ id="linestring_overlapping_polygon",
+ ),
+ # Polygon + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))",
+ "POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))",
+ "POLYGON ((2.5 2.5, 2.5 -2.5, 0 -2.502379, 0 -5, 5 -5, 5 5, 0 5, 0 2.502379, 2.5 2.5))",
+ id="polygon_overlapping_polygon",
+ ),
+ ],
+)
+def test_st_difference(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Difference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties - BigQuery doesn't return specific empty types consistently
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Point - Point: same -> empty
+ pytest.param("POINT (0 0)", "POINT (0 0)", "POINT (nan nan)", id="point_same"),
+ # Linestring - Linestring: same -> empty
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING EMPTY",
+ id="linestring_same",
+ ),
+ # Polygon - Polygon: same -> empty
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ id="polygon_same",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "GEOMETRYCOLLECTION EMPTY",
+ id="empty_a",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "POINT (0 0)",
+ id="empty_b_point",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="empty_b_polygon",
+ ),
+ ],
+)
+def test_st_difference_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Difference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Far apart geometries (coverings don't intersect)
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (180 0)",
+ "POINT (0 0)",
+ id="point_very_far",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((170 -5, 175 -5, 175 0, 170 0, 170 -5))",
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ id="polygon_very_far",
+ ),
+ ],
+)
+def test_st_difference_very_far(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Difference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# ST_Union tests
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_union"),
+ pytest.param("POINT (0 0)", None, None, id="union_null"),
+ pytest.param(None, None, None, id="null_union_null"),
+ # Point + Point: same
+ pytest.param("POINT (0 0)", "POINT (0 0)", "POINT (0 0)", id="point_same"),
+ # Point + Point: different
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ "MULTIPOINT (0 0, 0 1)",
+ id="point_different",
+ ),
+ # Multipoint + Point
+ pytest.param(
+ "MULTIPOINT (0 0, 1 1)",
+ "POINT (2 2)",
+ "MULTIPOINT (0 0, 1 1, 2 2)",
+ id="multipoint_point",
+ ),
+ # Multipoint + Point: overlap
+ pytest.param(
+ "MULTIPOINT (0 0, 1 1)",
+ "POINT (0 0)",
+ "MULTIPOINT (0 0, 1 1)",
+ id="multipoint_point_overlap",
+ ),
+ # Linestring + Linestring: disjoint
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 10, 10 10)",
+ "MULTILINESTRING ((0 0, 10 0), (0 10, 10 10))",
+ id="linestring_disjoint",
+ ),
+ # Linestring + Linestring: same
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ id="linestring_same",
+ ),
+ # Linestring + Linestring: touching
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 10, 0 15)",
+ "LINESTRING (0 0, 0 10, 0 15)",
+ id="linestring_touching",
+ ),
+ # Linestring + Linestring: overlap
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 5, 0 15)",
+ "LINESTRING (0 0, 0 5, 0 10, 0 15)",
+ id="linestring_overlap",
+ ),
+ # Linestring + Polygon: touching
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (0 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0)))",
+ id="linestring_touching_polygon",
+ ),
+ # Linestring + Polygon: overlapping edge
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (2.5 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 0, 2.5 0, 5 0, 5 5, 0 5, 0 0)))",
+ id="linestring_overlapping_polygon_edge",
+ ),
+ # Linestring + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 0, 0 5, 0 -5))",
+ "LINESTRING (2.5 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 -5, 5 0, 0 5, 0 0, 0 -5)))",
+ id="linestring_overlapping_polygon",
+ ),
+ # Polygon + Polygon: disjoint
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))",
+ "MULTIPOLYGON (((0 0, 5 0, 5 5, 0 5, 0 0)), "
+ "((10 10, 15 10, 15 15, 10 15, 10 10)))",
+ id="polygon_disjoint",
+ ),
+ # Polygon + Polygon: same
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="polygon_same",
+ ),
+ # Polygon + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))",
+ "POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))",
+ "POLYGON ((-2.5 -2.5, 0 -2.502379, 0 -5, 5 -5, 5 5, 0 5, 0 2.502379, -2.5 2.5, -2.5 -2.5))",
+ id="polygon_overlapping_polygon",
+ ),
+ ],
+)
+def test_st_union(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Union({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT EMPTY",
+ "POINT EMPTY",
+ "POINT (nan nan)",
+ id="both_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "POINT (0 0)",
+ id="empty_a_point",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "POINT (0 0)",
+ id="empty_b_point",
+ ),
+ pytest.param(
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="empty_a_polygon",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="empty_b_polygon",
+ ),
+ ],
+)
+def test_st_union_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Union({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# ST_SymDifference tests (not implemented on BigQuery)
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT (0 0)", None, id="null_symdifference"),
+ pytest.param("POINT (0 0)", None, None, id="symdifference_null"),
+ pytest.param(None, None, None, id="null_symdifference_null"),
+ # Point symdiff Point: different
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (0 1)",
+ "MULTIPOINT (0 0, 0 1)",
+ id="point_different",
+ ),
+ # Linestring symdiff Linestring: disjoint
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 10, 10 10)",
+ "MULTILINESTRING ((0 0, 10 0), (0 10, 10 10))",
+ id="linestring_disjoint",
+ ),
+ # Polygon symdiff Polygon: disjoint
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((10 10, 15 10, 15 15, 10 15, 10 10))",
+ "MULTIPOLYGON (((0 0, 5 0, 5 5, 0 5, 0 0)), "
+ "((10 10, 15 10, 15 15, 10 15, 10 10)))",
+ id="polygon_disjoint",
+ ),
+ # Linestring + Linestring: touching
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 10, 0 15)",
+ "LINESTRING (0 0, 0 10, 0 15)",
+ id="linestring_touching",
+ ),
+ # Linestring + Linestring: overlap
+ pytest.param(
+ "LINESTRING (0 0, 0 10)",
+ "LINESTRING (0 5, 0 15)",
+ "LINESTRING (0 0, 0 5, 0 10, 0 15)",
+ id="linestring_overlap",
+ ),
+ # Linestring + Polygon: touching
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (0 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0)))",
+ id="linestring_touching_polygon",
+ ),
+ # Linestring + Polygon: overlapping edge
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "LINESTRING (2.5 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 0, 2.5 0, 5 0, 5 5, 0 5, 0 0)))",
+ id="linestring_overlapping_polygon_edge",
+ ),
+ # Linestring + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 0, 0 5, 0 -5))",
+ "LINESTRING (2.5 0, -10 0)",
+ "GEOMETRYCOLLECTION (LINESTRING (0 0, -10 0), POLYGON ((0 -5, 5 0, 0 5, 0 0, 0 -5)))",
+ id="linestring_overlapping_polygon",
+ ),
+ # Polygon + Polygon: overlapping
+ pytest.param(
+ "POLYGON ((0 -5, 5 -5, 5 5, 0 5, 0 -5))",
+ "POLYGON ((-2.5 -2.5, 2.5 -2.5, 2.5 2.5, -2.5 2.5, -2.5 -2.5))",
+ "MULTIPOLYGON (((2.5 2.5, 2.5 -2.5, 0 -2.502379, 0 -5, 5 -5, 5 5, 0 5, 0 2.502379, 2.5 2.5)), ((-2.5 -2.5, 0 -2.502379, 0 2.502379, -2.5 2.5, -2.5 -2.5)))",
+ id="polygon_overlapping_polygon",
+ ),
+ ],
+)
+def test_st_symdifference(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_SymDifference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Empties
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+ pytest.param(
+ "POINT EMPTY",
+ "POINT EMPTY",
+ "POINT (nan nan)",
+ id="both_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POINT (0 0)",
+ "POINT (0 0)",
+ id="empty_a",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ "POINT EMPTY",
+ "POINT (0 0)",
+ id="empty_b",
+ ),
+ pytest.param(
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="empty_a_polygon",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="empty_b_polygon",
+ ),
+ ],
+)
+def test_st_symdifference_empties(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_SymDifference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Point symdiff Point: same -> empty
+ # Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+ pytest.param("POINT (0 0)", "POINT (0 0)", "POINT (nan nan)", id="point_same"),
+ # Linestring symdiff Linestring: same -> empty
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING (0 0, 10 0)",
+ "LINESTRING EMPTY",
+ id="linestring_same",
+ ),
+ # Polygon symdiff Polygon: same -> empty
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ "POLYGON EMPTY",
+ id="polygon_same",
+ ),
+ ],
+)
+def test_st_symdifference_returns_empty(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_SymDifference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Far apart geometries (coverings don't intersect) for symdifference
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ pytest.param(
+ "POINT (0 0)",
+ "POINT (180 0)",
+ "MULTIPOINT (0 0, 180 0)",
+ id="point_very_far",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))",
+ "POLYGON ((170 -5, 175 -5, 175 0, 170 0, 170 -5))",
+ "MULTIPOLYGON (((0 0, 5 0, 5 5, 0 5, 0 0)), "
+ "((170 -5, 175 -5, 175 0, 170 0, 170 -5)))",
+ id="polygon_very_far",
+ ),
+ ],
+)
+def test_st_symdifference_very_far(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_SymDifference({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ wkt_precision=6,
+ )
diff --git a/python/sedonadb/tests/geography/test_geog_predicates.py b/python/sedonadb/tests/geography/test_geog_predicates.py
index a08e4d382..929019e51 100644
--- a/python/sedonadb/tests/geography/test_geog_predicates.py
+++ b/python/sedonadb/tests/geography/test_geog_predicates.py
@@ -17,29 +17,223 @@
import pytest
import sedonadb
-from sedonadb.testing import BigQuery, PostGIS, SedonaDB, geog_or_null
+from sedonadb.testing import BigQuery, SedonaDB, PostGIS, geog_or_null
if "s2geography" not in sedonadb.__features__:
pytest.skip("Python package built without s2geography", allow_module_level=True)
-@pytest.mark.parametrize("eng", [SedonaDB, PostGIS, BigQuery])
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
@pytest.mark.parametrize(
("geom1", "geom2", "expected"),
[
- ("POINT (0 0)", "POINT (0 0)", True),
- ("POINT EMPTY", "POINT (0 0)", False),
- ("POINT (0 0)", "LINESTRING (0 0, 1 1)", True),
- ("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))", "LINESTRING (0 0, 1 1)", True),
- (
- "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
- "POLYGON ((5 5, 6 5, 6 6, 5 6, 5 5))",
+ # Nulls
+ pytest.param(None, "POINT EMPTY", None, id="null_intersects"),
+ pytest.param("POINT EMPTY", None, None, id="intersects_null"),
+ pytest.param(None, None, None, id="null_intersects_null"),
+ # Empties
+ pytest.param("POINT (0 0)", "POINT EMPTY", False, id="intersects_empty"),
+ pytest.param("POINT EMPTY", "POINT (0 0)", False, id="empty_intersects"),
+ # Point x polygon
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0.25 0.25)",
+ True,
+ id="polygon_intersects_point",
+ ),
+ # Point x wraparound polygon
+ pytest.param(
+ "POLYGON ((179 0, -179 0, 179 2, 179 0))",
+ "POINT (-180 0.25)",
+ True,
+ id="wraparound_polygon_intersects_point",
+ ),
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="point_intersects_polygon",
+ ),
+ # Point definitely not in polygon (outside the covering)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (-30 -30)",
+ False,
+ id="polygon_not_intersects_distant_point",
+ ),
+ # Point definitely not in polygon (probably inside the covering)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (1.01 1.01)",
+ False,
+ id="polygon_not_intersects_close_point",
+ ),
+ # Polygon x boundary point
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="boundary_point_intersects_polygon",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0 0)",
+ True,
+ id="polygon_intersects_boundary_point",
+ ),
+ # Polygon in polygon
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ True,
+ id="polygon_intersects_polygon",
+ ),
+ # Polygon x linestring (linestring fully inside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ True,
+ id="polygon_intersects_interior_linestring",
+ ),
+ pytest.param(
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="interior_linestring_intersects_polygon",
+ ),
+ # Polygon x linestring (linestring partially crosses boundary)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 3 3)",
+ True,
+ id="polygon_intersects_crossing_linestring",
+ ),
+ pytest.param(
+ "LINESTRING (0.25 0.25, 3 3)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="crossing_linestring_intersects_polygon",
+ ),
+ # Polygon x linestring (linestring fully outside)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (3 3, 4 4)",
+ False,
+ id="polygon_not_intersects_exterior_linestring",
+ ),
+ # Interior polygon fully inside (no shared vertices)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ True,
+ id="polygon_intersects_interior_polygon",
+ ),
+ # Two distant small polygons (brute force: all three checks fail)
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ False,
+ id="polygon_not_intersects_distant_polygon",
+ ),
+ # Linestring x linestring crossing
+ pytest.param(
+ "LINESTRING (0 0, 1 1)",
+ "LINESTRING (0 1, 1 0)",
+ True,
+ id="linestring_intersects_linestring_crossing",
+ ),
+ # Linestring x linestring shared vertex
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ "LINESTRING (1 0, 2 0)",
+ True,
+ id="linestring_intersects_linestring_shared_vertex",
+ ),
+ # Linestring x linestring disjoint
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ "LINESTRING (30 30, 31 30)",
+ False,
+ id="linestring_not_intersects_linestring",
+ ),
+ # Multipoint x multipoint (shared point)
+ pytest.param(
+ "MULTIPOINT (0 0, 1 1)",
+ "MULTIPOINT (1 1, 2 2)",
+ True,
+ id="multipoint_intersects_multipoint_shared",
+ ),
+ # Multipoint x multipoint disjoint
+ pytest.param(
+ "MULTIPOINT (0 0, 1 1)",
+ "MULTIPOINT (3 3, 4 4)",
False,
+ id="multipoint_not_intersects_multipoint",
+ ),
+ # Multipoint x linestring (point at line vertex)
+ pytest.param(
+ "MULTIPOINT (0 0, 5 5)",
+ "LINESTRING (0 0, 1 0)",
+ True,
+ id="multipoint_intersects_linestring_vertex",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ "MULTIPOINT (0 0, 5 5)",
+ True,
+ id="linestring_intersects_multipoint_vertex",
+ ),
+ # Multipoint x linestring disjoint
+ pytest.param(
+ "MULTIPOINT (5 5, 6 6)",
+ "LINESTRING (0 0, 1 0)",
+ False,
+ id="multipoint_not_intersects_linestring",
+ ),
+ # Multipoint x polygon (point inside polygon)
+ pytest.param(
+ "MULTIPOINT (0.25 0.25, 5 5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="multipoint_intersects_polygon_interior",
+ ),
+ # Multipoint x polygon disjoint
+ pytest.param(
+ "MULTIPOINT (5 5, 6 6)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="multipoint_not_intersects_polygon",
+ ),
+ # GEOMETRYCOLLECTION tests
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 1 0), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (0.25 0.25)",
+ True,
+ id="gc_intersects_point",
),
- (
- "POINT (1 1)",
- "GEOMETRYCOLLECTION (POINT (0 0), POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)), LINESTRING (0 0, 1 1))",
+ pytest.param(
+ "POINT (5 5)",
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (10 10, 11 10))",
True,
+ id="point_intersects_gc_point",
+ ),
+ pytest.param(
+ "LINESTRING (0.25 0.25, 3 3)",
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ True,
+ id="linestring_intersects_gc_polygon",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0.5 0.5), LINESTRING (0 0, 1 0))",
+ "GEOMETRYCOLLECTION (POINT (30 30), LINESTRING (0 0, 0 1))",
+ True,
+ id="gc_intersects_gc",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ "GEOMETRYCOLLECTION (POINT (30 30), LINESTRING (40 40, 41 41))",
+ False,
+ id="gc_not_intersects_gc",
),
],
)
@@ -49,3 +243,409 @@ def test_st_intersects(eng, geom1, geom2, expected):
f"SELECT ST_Intersects({geog_or_null(geom1)}, {geog_or_null(geom2)})",
expected,
)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT EMPTY", None, id="null_contains"),
+ pytest.param("POINT EMPTY", None, None, id="contains_null"),
+ pytest.param(None, None, None, id="null_contains_null"),
+ # Empties
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT EMPTY",
+ False,
+ id="contains_empty",
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="empty_contains",
+ ),
+ # Polygon contains interior point
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0.25 0.25)",
+ True,
+ id="polygon_contains_point",
+ ),
+ # Point x wraparound polygon
+ pytest.param(
+ "POLYGON ((179 0, -179 0, 179 2, 179 0))",
+ "POINT (-180 0.25)",
+ True,
+ id="wraparound_polygon_contains_point",
+ ),
+ # Point does not contain anything
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="point_not_contains_polygon",
+ ),
+ # Point definitely not in polygon (outside the covering)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (-30 -30)",
+ False,
+ id="polygon_not_contains_distant_point",
+ ),
+ # Point definitely not in polygon (probably inside the covering)
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (1.01 1.01)",
+ False,
+ id="polygon_not_contains_close_point",
+ ),
+ # Polygon does not contain boundary point
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0 0)",
+ False,
+ id="polygon_not_contains_boundary_point",
+ ),
+ # Polygon contains interior sub-polygon
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ True,
+ id="polygon_contains_polygon",
+ ),
+ # Interior polygon does not contain Polygon
+ pytest.param(
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="polygon_does_not_contain_polygon",
+ ),
+ # Polygon contains interior linestring
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ True,
+ id="polygon_contains_interior_linestring",
+ ),
+ # Polygon does not contain linestring that crosses boundary
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (0.25 0.25, 3 3)",
+ False,
+ id="polygon_not_contains_crossing_linestring",
+ ),
+ # Polygon does not contain exterior linestring
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "LINESTRING (3 3, 4 4)",
+ False,
+ id="polygon_not_contains_exterior_linestring",
+ ),
+ # Linestring does not contain point
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ "POINT (10 10)",
+ False,
+ id="linestring_not_contains_point",
+ ),
+ # Linestring does not contain linestring
+ pytest.param(
+ "LINESTRING (0 0, 2 0)",
+ "LINESTRING (10 10, 11 10)",
+ False,
+ id="linestring_not_contains_linestring",
+ ),
+ # Polygon does not contain overlapping polygon
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0.1 0.1, 3 0.1, 0.1 3, 0.1 0.1))",
+ False,
+ id="polygon_not_contains_overlapping_polygon",
+ ),
+ # Polygon does not contain distant polygon
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ False,
+ id="polygon_not_contains_distant_polygon",
+ ),
+ # GEOMETRYCOLLECTION tests
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), LINESTRING (40 40, 41 40), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POINT (0.25 0.25)",
+ True,
+ id="gc_contains_point",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ True,
+ id="gc_contains_linestring",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "GEOMETRYCOLLECTION (POINT (0.25 0.25), LINESTRING (0.3 0.3, 0.4 0.4))",
+ True,
+ id="polygon_contains_gc",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "GEOMETRYCOLLECTION (POINT (30 30), LINESTRING (0.3 0.3, 0.4 0.4))",
+ False,
+ id="polygon_not_contains_gc_point_outside",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (30 30), POLYGON ((0 0, 2 0, 0 2, 0 0)))",
+ "POLYGON ((0.1 0.1, 3 0.1, 0.1 3, 0.1 0.1))",
+ False,
+ id="gc_not_contains_crossing_polygon",
+ ),
+ ],
+)
+def test_st_contains(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Contains({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Within is the reverse of Contains
+ # Point within polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="point_within_polygon",
+ ),
+ # Point within wraparound polygon
+ pytest.param(
+ "POINT (-180 0.25)",
+ "POLYGON ((179 0, -179 0, 179 2, 179 0))",
+ True,
+ id="point_within_wraparound_polygon",
+ ),
+ # Point not within polygon (outside)
+ pytest.param(
+ "POINT (-1 -1)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="point_not_within_polygon",
+ ),
+ # Polygon is not within point
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0.25 0.25)",
+ False,
+ id="polygon_not_within_point",
+ ),
+ # Null handling
+ pytest.param(None, "POLYGON ((0 0, 2 0, 0 2, 0 0))", None, id="null_within"),
+ pytest.param("POINT (0 0)", None, None, id="within_null"),
+ # Interior linestring within polygon
+ pytest.param(
+ "LINESTRING (0.25 0.25, 0.5 0.5)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="linestring_within_polygon",
+ ),
+ # Crossing linestring not within polygon
+ pytest.param(
+ "LINESTRING (0.25 0.25, 3 3)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="crossing_linestring_not_within_polygon",
+ ),
+ # Interior polygon within larger polygon
+ pytest.param(
+ "POLYGON ((0.1 0.1, 0.5 0.1, 0.1 0.5, 0.1 0.1))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ True,
+ id="polygon_within_polygon",
+ ),
+ # Boundary point not within polygon
+ pytest.param(
+ "POINT (0 0)",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="boundary_point_not_within_polygon",
+ ),
+ ],
+)
+def test_st_within(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Within({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Nulls
+ pytest.param(None, "POINT EMPTY", None, id="null_equals"),
+ pytest.param("POINT EMPTY", None, None, id="equals_null"),
+ pytest.param(None, None, None, id="null_equals_null"),
+ # Empties
+ pytest.param("POINT (0 0)", "POINT EMPTY", False, id="equals_empty"),
+ pytest.param("POINT EMPTY", "POINT (0 0)", False, id="empty_equals"),
+ pytest.param(
+ "POINT EMPTY", "POINT EMPTY", True, id="empty_point_equals_empty_point"
+ ),
+ pytest.param(
+ "POINT EMPTY",
+ "LINESTRING EMPTY",
+ True,
+ id="empty_point_equals_empty_linestring",
+ ),
+ # Fast path for identical values
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ True,
+ id="polygon_equals_identical_polygon",
+ ),
+ # Rotated vertices
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((1 0, 0 1, 0 0, 1 0))",
+ True,
+ id="polygon_equals_polygon",
+ ),
+ # Potentially intersecting but not equal
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="polygon_not_equals_close_polygon",
+ ),
+ # Not at all intersecting and not equal
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 32 30, 30 32, 30 30))",
+ False,
+ id="polygon_not_equals_distant_polygon",
+ ),
+ # Different number of chains
+ pytest.param(
+ "MULTIPOLYGON (((0 0, 1 0, 0 1, 0 0)), ((10 10, 11 10, 10 11, 10 10)))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ False,
+ id="polygon_not_equals_chains_ne",
+ ),
+ # Different number of edges
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 1, 0 0))",
+ False,
+ id="polygon_not_equals_edges_ne",
+ ),
+ # GEOMETRYCOLLECTION tests
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ True,
+ id="gc_equals_gc_identical",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 2 2))",
+ "GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (1 1, 3 3))",
+ False,
+ id="gc_not_equals_gc",
+ ),
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (0 0))",
+ "POINT (0 0)",
+ True,
+ id="gc_not_equals_point",
+ ),
+ ],
+)
+def test_st_equals(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Equals({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geom1", "geom2", "expected"),
+ [
+ # Disjoint is the opposite of Intersects
+ # Polygon disjoint from distant point
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (-30 -30)",
+ True,
+ id="polygon_disjoint_distant_point",
+ ),
+ # Polygon not disjoint from interior point
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POINT (0.25 0.25)",
+ False,
+ id="polygon_not_disjoint_interior_point",
+ ),
+ # Null handling
+ pytest.param(None, "POLYGON ((0 0, 1 0, 0 1, 0 0))", None, id="null_disjoint"),
+ pytest.param("POINT (0 0)", None, None, id="disjoint_null"),
+ # Interior point not disjoint from polygon
+ pytest.param(
+ "POINT (0.25 0.25)",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ False,
+ id="point_not_disjoint_polygon",
+ ),
+ # Exterior point disjoint from polygon
+ pytest.param(
+ "POINT (-1 -1)",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ True,
+ id="point_disjoint_polygon",
+ ),
+ # Distant polygons are disjoint
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ "POLYGON ((30 30, 31 30, 30 31, 30 30))",
+ True,
+ id="polygon_disjoint_distant_polygon",
+ ),
+ # Overlapping polygons are not disjoint
+ pytest.param(
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ False,
+ id="polygon_not_disjoint_polygon",
+ ),
+ # Crossing linestrings are not disjoint
+ pytest.param(
+ "LINESTRING (0 0, 1 1)",
+ "LINESTRING (0 1, 1 0)",
+ False,
+ id="linestring_not_disjoint_linestring",
+ ),
+ # Non-crossing linestrings are disjoint
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ "LINESTRING (30 30, 31 30)",
+ True,
+ id="linestring_disjoint_linestring",
+ ),
+ ],
+)
+def test_st_disjoint(eng, geom1, geom2, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Disjoint({geog_or_null(geom1)}, {geog_or_null(geom2)})",
+ expected,
+ )
diff --git a/python/sedonadb/tests/geography/test_geog_s2.py b/python/sedonadb/tests/geography/test_geog_s2.py
new file mode 100644
index 000000000..5b1d170ee
--- /dev/null
+++ b/python/sedonadb/tests/geography/test_geog_s2.py
@@ -0,0 +1,94 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import pytest
+import sedonadb
+from sedonadb.testing import SedonaDB, BigQuery, geog_or_null
+
+if "s2geography" not in sedonadb.__features__:
+ pytest.skip("Python package built without s2geography", allow_module_level=True)
+
+
+# S2_CellIdFromPoint tests - returns the S2 cell ID containing a point
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Valid points
+ pytest.param("POINT (0 0)", 1152921504606846977, id="point_origin"),
+ pytest.param("POINT (0 1)", 1153451514845492609, id="point_1_degree"),
+ ],
+)
+def test_s2_cellidfrompoint(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT S2_CellIdFromPoint({geog_or_null(geog)})",
+ expected,
+ )
+
+
+# BigQuery doesn't handle empty input
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Empties
+ pytest.param("POINT EMPTY", None, id="empty_point"),
+ ],
+)
+def test_s2_cellidfrompoint_empties(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT S2_CellIdFromPoint({geog_or_null(geog)})",
+ expected,
+ )
+
+
+# S2_CoveringCellIds tests - returns a list of S2 cell IDs covering a geometry
+# These are not stable across S2 versions/platforms so we just test the size here.
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Empties return empty list
+ pytest.param("POINT EMPTY", [], id="empty_point"),
+ # Single point returns one cell
+ pytest.param("POINT (0 0)", [1152921504606846977], id="point_origin"),
+ # Linestring
+ pytest.param(
+ "LINESTRING (0 0, 1 1)",
+ [
+ 384307168202282325,
+ 1152921504606846975,
+ 1152939096792891392,
+ 1152991873349976064,
+ 1153009465537069056,
+ 1153273348327735296,
+ 1153390629569429504,
+ 1921535841011411627,
+ ],
+ id="linestring",
+ ),
+ ],
+)
+def test_s2_coveringcellids(eng, geog, expected):
+ eng = eng.create_or_skip()
+ result = eng.execute_and_collect(
+ f"SELECT S2_CoveringCellIds({geog_or_null(geog)})",
+ )
+ df = eng.result_to_pandas(result)
+ assert len(df.iloc[0, 0]) == len(expected)
diff --git a/python/sedonadb/tests/geography/test_geog_transformations.py b/python/sedonadb/tests/geography/test_geog_transformations.py
index 741c9bde7..f24e0d346 100644
--- a/python/sedonadb/tests/geography/test_geog_transformations.py
+++ b/python/sedonadb/tests/geography/test_geog_transformations.py
@@ -16,7 +16,7 @@
# under the License.
import pytest
-from sedonadb.testing import BigQuery, PostGIS, SedonaDB, geog_or_null
+from sedonadb.testing import BigQuery, PostGIS, SedonaDB, geog_or_null, val_or_null
import sedonadb
if "s2geography" not in sedonadb.__features__:
@@ -37,3 +37,845 @@ def test_st_centroid(eng, geom, expected):
eng.assert_query_result(
f"SELECT ST_Centroid({geog_or_null(geom)})", expected, wkt_precision=4
)
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Nulls
+ pytest.param(None, None, id="null_centroid"),
+ # Empties
+ pytest.param("POINT EMPTY", "GEOMETRYCOLLECTION EMPTY", id="point_empty"),
+ pytest.param(
+ "LINESTRING EMPTY", "GEOMETRYCOLLECTION EMPTY", id="linestring_empty"
+ ),
+ pytest.param("POLYGON EMPTY", "GEOMETRYCOLLECTION EMPTY", id="polygon_empty"),
+ # Points
+ pytest.param("POINT (0 1)", "POINT (0 1)", id="point"),
+ pytest.param("MULTIPOINT ((0 0), (0 1))", "POINT (0 0.5)", id="multipoint"),
+ # Linestrings
+ pytest.param("LINESTRING (0 0, 0 1)", "POINT (0 0.5)", id="linestring"),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 5)", "POINT (0 2.5)", id="linestring_two_segments"
+ ),
+ pytest.param(
+ "LINESTRING (-90 80, -90 85, 90 80)",
+ "POINT (-31.7828668356 90)",
+ id="linestring_crossing_pole",
+ ),
+ # Polygons
+ pytest.param(
+ "POLYGON ((0 0, 0 1, 1 0, 0 0))",
+ "POINT (0.3333498812 0.3333442395)",
+ id="triangle",
+ ),
+ ],
+)
+def test_st_centroid_extended(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Centroid({geog_or_null(geog)})", expected, wkt_precision=10
+ )
+
+
+# Neither PostGIS nor BigQuery support ZM in their centroid calculation
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geom", "expected"),
+ [
+ # Points with Z
+ pytest.param("POINT Z (0 1 10)", "POINT Z (0 1 10)", id="point_z"),
+ pytest.param(
+ "MULTIPOINT Z ((0 0 10), (0 1 11))",
+ "POINT Z (0 0.5 10.5)",
+ id="multipoint_z",
+ ),
+ # Points with M
+ pytest.param("POINT M (0 1 10)", "POINT M (0 1 10)", id="point_m"),
+ pytest.param(
+ "MULTIPOINT M ((0 0 10), (0 1 11))",
+ "POINT M (0 0.5 10.5)",
+ id="multipoint_m",
+ ),
+ # Points with ZM
+ pytest.param("POINT ZM (0 1 10 20)", "POINT ZM (0 1 10 20)", id="point_zm"),
+ pytest.param(
+ "MULTIPOINT ZM ((0 0 10 20), (0 1 11 21))",
+ "POINT ZM (0 0.5 10.5 20.5)",
+ id="multipoint_zm",
+ ),
+ # Linestrings with Z
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 1 11)",
+ "POINT Z (0 0.5 10.5)",
+ id="linestring_z",
+ ),
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 1 11, 0 5 15)",
+ "POINT Z (0 2.5 12.5)",
+ id="linestring_two_segments_z",
+ ),
+ # Linestrings with M
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 1 11)",
+ "POINT M (0 0.5 10.5)",
+ id="linestring_m",
+ ),
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 1 11, 0 5 15)",
+ "POINT M (0 2.5 12.5)",
+ id="linestring_two_segments_m",
+ ),
+ # Linestrings with ZM
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 1 11 21)",
+ "POINT ZM (0 0.5 10.5 20.5)",
+ id="linestring_zm",
+ ),
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 1 11 21, 0 5 15 25)",
+ "POINT ZM (0 2.5 12.5 22.5)",
+ id="linestring_two_segments_zm",
+ ),
+ # Polygons with Z
+ pytest.param(
+ "POLYGON Z ((0 0 10, 0 1 10, 1 0 10, 0 0 10))",
+ "POINT Z (0.3333 0.3333 10)",
+ id="triangle_z",
+ ),
+ pytest.param(
+ "POLYGON Z ((0 0 10, 0 2 10, 2 0 10, 0 0 10), "
+ "(0.1 0.1 11, 0.1 0.5 11, 0.5 0.1 11, 0.1 0.1 11))",
+ "POINT Z (0.6849 0.6848 10.0385)",
+ id="polygon_with_hole_z",
+ ),
+ # Polygons with M
+ pytest.param(
+ "POLYGON M ((0 0 10, 0 1 10, 1 0 10, 0 0 10))",
+ "POINT M (0.3333 0.3333 10)",
+ id="triangle_m",
+ ),
+ pytest.param(
+ "POLYGON M ((0 0 10, 0 2 10, 2 0 10, 0 0 10), "
+ "(0.1 0.1 11, 0.1 0.5 11, 0.5 0.1 11, 0.1 0.1 11))",
+ "POINT M (0.6849 0.6848 10.0385)",
+ id="polygon_with_hole_m",
+ ),
+ # Polygons with ZM
+ pytest.param(
+ "POLYGON ZM ((0 0 10 20, 0 1 10 20, 1 0 10 20, 0 0 10 20))",
+ "POINT ZM (0.3333 0.3333 10 20)",
+ id="triangle_zm",
+ ),
+ pytest.param(
+ "POLYGON ZM ((0 0 10 20, 0 2 10 20, 2 0 10 20, 0 0 10 20), "
+ "(0.1 0.1 11 21, 0.1 0.5 11 21, 0.5 0.1 11 21, 0.1 0.1 11 21))",
+ "POINT ZM (0.6849 0.6848 10.0385 20.0385)",
+ id="polygon_with_hole_zm",
+ ),
+ ],
+)
+def test_st_centroid_zm(eng, geom, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Centroid({geog_or_null(geom)})", expected, wkt_precision=4
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Nulls
+ pytest.param(None, None, id="null_convex_hull"),
+ # Points
+ pytest.param("POINT (0 1)", "POINT (0 1)", id="point"),
+ pytest.param(
+ "MULTIPOINT ((0 0), (0 1), (1 0))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ id="multipoint_three",
+ ),
+ # Linestrings
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 1 0)",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ id="linestring_non_colinear",
+ ),
+ # Polygons
+ pytest.param(
+ "POLYGON ((0 0, 0 1, 1 0, 0 0))",
+ "POLYGON ((0 0, 1 0, 0 1, 0 0))",
+ id="triangle",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 0 2, 2 0, 0 0), (0.1 0.1, 0.1 0.5, 0.5 0.1, 0.1 0.1))",
+ "POLYGON ((0 0, 2 0, 0 2, 0 0))",
+ id="polygon_with_hole",
+ ),
+ # GeometryCollection (convex hull of all vertices)
+ pytest.param(
+ "GEOMETRYCOLLECTION (POINT (5 5), LINESTRING (0 0, 0 1), POLYGON ((0 0, 0 1, 1 0, 0 0)))",
+ "POLYGON ((0 0, 1 0, 5 5, 0 1, 0 0))",
+ id="geometrycollection",
+ ),
+ ],
+)
+def test_st_convexhull(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ConvexHull({geog_or_null(geog)})", expected, wkt_precision=10
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Empties
+ # Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+ pytest.param("POINT EMPTY", "POINT (nan nan)", id="point_empty"),
+ pytest.param("LINESTRING EMPTY", "LINESTRING EMPTY", id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", "POLYGON EMPTY", id="polygon_empty"),
+ pytest.param(
+ "MULTIPOINT ((0 0), (0 1))", "LINESTRING (0 0, 0 1)", id="multipoint_two"
+ ),
+ # Linestrings
+ pytest.param("LINESTRING (0 0, 0 1)", "LINESTRING (0 0, 0 1)", id="linestring"),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 2)",
+ "LINESTRING (0 0, 0 2)",
+ id="linestring_colinear",
+ ),
+ ],
+)
+def test_st_convexhull_degenerate(eng, geog, expected):
+ # Empty/degenerate behaviour does not match BigQuery but instead matches
+ # what PostGIS would give for a geometry implementation.
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ConvexHull({geog_or_null(geog)})",
+ expected,
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "expected"),
+ [
+ # Empties
+ # Currently geoarrow returns POINT (nan, nan) instead of POINT EMPTY
+ pytest.param("POINT EMPTY", "POINT (nan nan)", id="point_empty"),
+ pytest.param("LINESTRING EMPTY", "POINT (nan nan)", id="linestring_empty"),
+ pytest.param("POLYGON EMPTY", "POINT (nan nan)", id="polygon_empty"),
+ # Points
+ pytest.param("POINT (0 1)", "POINT (0 1)", id="point"),
+ pytest.param("MULTIPOINT ((0 0), (0 1))", "POINT (0 1)", id="multipoint"),
+ # Points with Z/M/ZM
+ pytest.param("POINT Z (0 1 10)", "POINT Z (0 1 10)", id="point_z"),
+ pytest.param("POINT M (0 1 10)", "POINT M (0 1 10)", id="point_m"),
+ pytest.param("POINT ZM (0 1 10 20)", "POINT ZM (0 1 10 20)", id="point_zm"),
+ # Linestrings
+ pytest.param("LINESTRING (0 0, 0 1)", "POINT (0 1)", id="linestring"),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 5)", "POINT (0 1)", id="linestring_three_vertices"
+ ),
+ # Linestrings with Z/M/ZM
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 1 11)", "POINT Z (0 1 11)", id="linestring_z"
+ ),
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 1 11)", "POINT M (0 1 11)", id="linestring_m"
+ ),
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 1 11 21)",
+ "POINT ZM (0 1 11 21)",
+ id="linestring_zm",
+ ),
+ # Polygons
+ pytest.param(
+ "POLYGON ((0 0, 0 1, 1 0, 0 0))",
+ "POINT (0.224466 0.224464)",
+ id="triangle",
+ ),
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
+ "POINT (0.450237 0.450223)",
+ id="square",
+ ),
+ # Polygons with Z/M/ZM are not yet supported and return a 2D result
+ ],
+)
+def test_st_pointonsurface(eng, geog, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_PointOnSurface({geog_or_null(geog)})", expected, wkt_precision=6
+ )
+
+
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("line", "fraction", "expected"),
+ [
+ # Nulls
+ pytest.param(None, 0.5, None, id="null_line"),
+ # Endpoints and midpoints
+ pytest.param("LINESTRING (0 0, 0 2)", 0.0, "POINT (0 0)", id="start"),
+ pytest.param("LINESTRING (0 0, 0 2)", 1.0, "POINT (0 2)", id="end"),
+ pytest.param("LINESTRING (0 0, 0 2)", 0.5, "POINT (0 1)", id="midpoint"),
+ # Multi-segment line
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 2)",
+ 0.25,
+ "POINT (0 0.5)",
+ id="multi_seg_quarter",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 0 1, 0 2)",
+ 0.75,
+ "POINT (0 1.5)",
+ id="multi_seg_three_quarter",
+ ),
+ # Boundary fractions
+ pytest.param("LINESTRING (0 0, 0 2)", 0.0, "POINT (0 0)", id="fraction_zero"),
+ pytest.param("LINESTRING (0 0, 0 2)", 1.0, "POINT (0 2)", id="fraction_one"),
+ ],
+)
+def test_st_line_interpolate_point(eng, line, fraction, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LineInterpolatePoint({geog_or_null(line)}, {val_or_null(fraction)})",
+ expected,
+ wkt_precision=4,
+ )
+
+
+# Degenerate behaviour matches PostGIS and not BigQuery
+@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
+@pytest.mark.parametrize(
+ ("line", "fraction", "expected"),
+ [
+ # Empties
+ pytest.param("LINESTRING EMPTY", 0.0, None, id="empty_line"),
+ # Degenerate
+ pytest.param(
+ "LINESTRING (1 1, 1 1)", 0.5, "POINT (1 1)", id="zero_length_line"
+ ),
+ ],
+)
+def test_st_line_interpolate_point_degenerate(eng, line, fraction, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LineInterpolatePoint({geog_or_null(line)}, {val_or_null(fraction)})",
+ expected,
+ wkt_precision=15,
+ )
+
+
+# Z/M/ZM support only in SedonaDB
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("line", "fraction", "expected"),
+ [
+ # Linestring with Z
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 2 12)", 0.0, "POINT Z (0 0 10)", id="start_z"
+ ),
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 2 12)", 1.0, "POINT Z (0 2 12)", id="end_z"
+ ),
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 2 12)", 0.5, "POINT Z (0 1 11)", id="midpoint_z"
+ ),
+ # Linestring with M
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 2 12)", 0.0, "POINT M (0 0 10)", id="start_m"
+ ),
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 2 12)", 1.0, "POINT M (0 2 12)", id="end_m"
+ ),
+ pytest.param(
+ "LINESTRING M (0 0 10, 0 2 12)", 0.5, "POINT M (0 1 11)", id="midpoint_m"
+ ),
+ # Linestring with ZM
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 2 12 22)",
+ 0.0,
+ "POINT ZM (0 0 10 20)",
+ id="start_zm",
+ ),
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 2 12 22)",
+ 1.0,
+ "POINT ZM (0 2 12 22)",
+ id="end_zm",
+ ),
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 2 12 22)",
+ 0.5,
+ "POINT ZM (0 1 11 21)",
+ id="midpoint_zm",
+ ),
+ # Multi-segment line with Z
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 1 11, 0 2 12)",
+ 0.25,
+ "POINT Z (0 0.5 10.5)",
+ id="multi_seg_quarter_z",
+ ),
+ pytest.param(
+ "LINESTRING Z (0 0 10, 0 1 11, 0 2 12)",
+ 0.75,
+ "POINT Z (0 1.5 11.5)",
+ id="multi_seg_three_quarter_z",
+ ),
+ # Multi-segment line with ZM
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 1 11 21, 0 2 12 22)",
+ 0.25,
+ "POINT ZM (0 0.5 10.5 20.5)",
+ id="multi_seg_quarter_zm",
+ ),
+ pytest.param(
+ "LINESTRING ZM (0 0 10 20, 0 1 11 21, 0 2 12 22)",
+ 0.75,
+ "POINT ZM (0 1.5 11.5 21.5)",
+ id="multi_seg_three_quarter_zm",
+ ),
+ ],
+)
+def test_st_line_interpolate_point_zm(eng, line, fraction, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_LineInterpolatePoint({geog_or_null(line)}, {val_or_null(fraction)})",
+ expected,
+ wkt_precision=15,
+ )
+
+
+# ST_Buffer tests - creates a buffer polygon around a geometry
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("geog", "distance", "expected"),
+ [
+ # Null
+ pytest.param(None, 100000.0, None, id="null_buffer"),
+ pytest.param("POINT (0 1)", None, None, id="buffer_null"),
+ # Point with positive distance: produces a polygon approximating a circle
+ pytest.param(
+ "POINT (0 0)",
+ 100000.0,
+ 31213847614.041348,
+ id="point_positive_distance",
+ ),
+ # Linestring with positive distance: produces a buffered corridor
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ 100000.0,
+ 53452519026.41781,
+ id="linestring_positive_distance",
+ ),
+ # Polygon with positive distance: expands the polygon
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
+ 100000.0,
+ 88052039626.29015,
+ id="polygon_positive_distance",
+ ),
+ # Polygon with negative distance shrinks the polygon
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
+ -10000.0,
+ 8316265500.336526,
+ id="polygon_negative_distance",
+ ),
+ # Polygon with negative distance that shrinks the polygon all the way
+ pytest.param(
+ "POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))",
+ -100000.0,
+ 0.0,
+ id="polygon_negative_distance_shrink_all_the_way",
+ ),
+ ],
+)
+def test_st_buffer(eng, geog, distance, expected):
+ eng = eng.create_or_skip()
+ # Check the area because it is tricky to check the actual value and here we
+ # are mostly checking for plugged-in ness.
+ eng.assert_query_result(
+ f"SELECT ST_Area(ST_Buffer({geog_or_null(geog)}, {val_or_null(distance)}))",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# ST_Buffer tests with num_quad_segs - controls circle approximation quality
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery, PostGIS])
+@pytest.mark.parametrize(
+ ("geog", "distance", "num_quad_segs", "expected"),
+ [
+ # Point with different num_quad_segs: more segments = closer to true circle
+ pytest.param(
+ "POINT (0 0)",
+ 100000.0,
+ 4,
+ 30614189578.97585,
+ id="point_quad_segs_4",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ 100000.0,
+ 8,
+ 31213847614.041348,
+ id="point_quad_segs_8",
+ ),
+ pytest.param(
+ "POINT (0 0)",
+ 100000.0,
+ 16,
+ 31364850259.39363,
+ id="point_quad_segs_16",
+ ),
+ ],
+)
+def test_st_buffer_num_quad_segs(eng, geog, distance, num_quad_segs, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Area(ST_Buffer({geog_or_null(geog)}, {val_or_null(distance)}, {num_quad_segs}))",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# ST_Buffer tests with style params - controls buffer shape via string parameters
+@pytest.mark.parametrize("eng", [SedonaDB, PostGIS])
+@pytest.mark.parametrize(
+ ("geog", "distance", "params", "expected"),
+ [
+ # Endcap styles (for linestrings)
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ 100000.0,
+ "endcap=round",
+ 53452519026.41781,
+ id="linestring_endcap_round",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ 100000.0,
+ "endcap=flat",
+ 22238671472.442112,
+ id="linestring_endcap_flat",
+ ),
+ # Side options (for linestrings)
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ 100000.0,
+ "side=left",
+ 11119335736.221052,
+ id="linestring_side_left",
+ ),
+ pytest.param(
+ "LINESTRING (0 0, 1 0)",
+ 100000.0,
+ "side=right",
+ 11119335736.221058,
+ id="linestring_side_right",
+ ),
+ ],
+)
+def test_st_buffer_params(eng, geog, distance, params, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Area(ST_Buffer({geog_or_null(geog)}, {val_or_null(distance)}, '{params}'))",
+ expected,
+ numeric_epsilon=eng.geography_numeric_epsilon(),
+ )
+
+
+# ST_ReducePrecision tests - snaps coordinates to a grid
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "grid_size", "expected"),
+ [
+ # Null inputs
+ pytest.param("POINT (0 0)", None, None, id="null_grid_size"),
+ # Point snapping to whole degrees (grid_size = 1.0)
+ pytest.param("POINT (0 0)", 1.0, "POINT (0 0)", id="point_on_grid"),
+ pytest.param("POINT (0.001 0.001)", 1.0, "POINT (0 0)", id="point_not_on_grid"),
+ pytest.param(
+ "POINT (0.001 0.001)", -1, "POINT (0.001 0.001)", id="point_no_snap"
+ ),
+ # Point snapping to 0.1 degree grid (grid_size = 0.1)
+ pytest.param(
+ "POINT (0.1 0.1)", 0.1, "POINT (0.1 0.1)", id="point_tenth_degree_on_grid"
+ ),
+ pytest.param(
+ "POINT (0.12 0.12)", 0.1, "POINT (0.1 0.1)", id="point_tenth_degree_snap"
+ ),
+ # Multipoint: two nearby points snap to same location
+ pytest.param(
+ "MULTIPOINT ((0.001 0.001), (0.002 0.002))",
+ 1.0,
+ "POINT (0 0)",
+ id="multipoint_merge",
+ ),
+ # Multipoint: points remain distinct after snapping
+ pytest.param(
+ "MULTIPOINT ((0 0), (10 10))",
+ 1.0,
+ "MULTIPOINT (0 0, 10 10)",
+ id="multipoint_distinct",
+ ),
+ # Linestring: no snapping needed
+ pytest.param(
+ "LINESTRING (0 0, 10 10)",
+ 1.0,
+ "LINESTRING (0 0, 10 10)",
+ id="linestring_on_grid",
+ ),
+ # Linestring: endpoints snap to grid
+ pytest.param(
+ "LINESTRING (0.001 0.001, 10.001 10.001)",
+ 1.0,
+ "LINESTRING (0 0, 10 10)",
+ id="linestring_snap",
+ ),
+ # Linestring: no snapping with negative grid size
+ pytest.param(
+ "LINESTRING (0.001 0.001, 10.001 10.001)",
+ -1,
+ "LINESTRING (0.001 0.001, 10.001 10.001)",
+ id="linestring_no_snap",
+ ),
+ # Polygon: single ring, no snapping
+ pytest.param(
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ -1,
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="polygon_simple",
+ ),
+ # Polygon: single ring with snapping
+ pytest.param(
+ "POLYGON ((0.001 0.001, 10.001 0.001, 10.001 10.001, "
+ "0.001 10.001, 0.001 0.001))",
+ 1.0,
+ "POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))",
+ id="polygon_snap",
+ ),
+ ],
+)
+def test_st_reduceprecision(eng, geog, grid_size, expected):
+ eng = eng.create_or_skip()
+ if eng.name() == "bigquery":
+ fn_name = "st_snaptogrid"
+ else:
+ fn_name = "st_reduceprecision"
+ eng.assert_query_result(
+ f"SELECT {fn_name}({geog_or_null(geog)}, {val_or_null(grid_size)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Z/M/ZM support only in SedonaDB
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "grid_size", "expected"),
+ [
+ # Point with Z
+ pytest.param("POINT Z (0 1 10)", 1.0, "POINT Z (0 1 10)", id="point_on_grid_z"),
+ pytest.param(
+ "POINT Z (0.01 1.01 10)", 1.0, "POINT Z (0 1 10)", id="point_not_on_grid_z"
+ ),
+ pytest.param(
+ "MULTIPOINT Z ((0.01 1.01 10), (0.01 1.01 20))",
+ 1.0,
+ "POINT Z (0 1 10)",
+ id="multipoint_merge_z",
+ ),
+ pytest.param(
+ "MULTIPOINT Z ((0.01 1.01 10), (2.01 3.01 20))",
+ 1.0,
+ "MULTIPOINT Z (0 1 10, 2 3 20)",
+ id="multipoint_distinct_z",
+ ),
+ # Point with M
+ pytest.param("POINT M (0 1 10)", 1.0, "POINT M (0 1 10)", id="point_on_grid_m"),
+ pytest.param(
+ "POINT M (0.01 1.01 10)", 1.0, "POINT M (0 1 10)", id="point_not_on_grid_m"
+ ),
+ pytest.param(
+ "MULTIPOINT M ((0.01 1.01 10), (0.01 1.01 20))",
+ 1.0,
+ "POINT M (0 1 10)",
+ id="multipoint_merge_m",
+ ),
+ pytest.param(
+ "MULTIPOINT M ((0.01 1.01 10), (2.01 3.01 20))",
+ 1.0,
+ "MULTIPOINT M (0 1 10, 2 3 20)",
+ id="multipoint_distinct_m",
+ ),
+ # Point with ZM
+ pytest.param(
+ "POINT ZM (0 1 10 100)", 1.0, "POINT ZM (0 1 10 100)", id="point_on_grid_zm"
+ ),
+ pytest.param(
+ "POINT ZM (0.01 1.01 10 100)",
+ 1.0,
+ "POINT ZM (0 1 10 100)",
+ id="point_not_on_grid_zm",
+ ),
+ pytest.param(
+ "MULTIPOINT ZM ((0.01 1.01 10 100), (0.01 1.01 20 200))",
+ 1.0,
+ "POINT ZM (0 1 10 100)",
+ id="multipoint_merge_zm",
+ ),
+ pytest.param(
+ "MULTIPOINT ZM ((0.01 1.01 10 100), (2.01 3.01 20 200))",
+ 1.0,
+ "MULTIPOINT ZM (0 1 10 100, 2 3 20 200)",
+ id="multipoint_distinct_zm",
+ ),
+ # Linestring with Z
+ pytest.param(
+ "LINESTRING Z (0 0 100, 10 10 200)",
+ 1.0,
+ "LINESTRING Z (0 0 100, 10 10 200)",
+ id="linestring_z",
+ ),
+ # Linestring with M
+ pytest.param(
+ "LINESTRING M (0 0 100, 10 10 200)",
+ 1.0,
+ "LINESTRING M (0 0 100, 10 10 200)",
+ id="linestring_m",
+ ),
+ # Linestring with ZM
+ pytest.param(
+ "LINESTRING ZM (0 0 100 1000, 10 10 200 2000)",
+ 1.0,
+ "LINESTRING ZM (0 0 100 1000, 10 10 200 2000)",
+ id="linestring_zm",
+ ),
+ # Multilinestring with Z
+ pytest.param(
+ "MULTILINESTRING Z ((0 0 100, 10 10 200), (20 20 300, 30 30 400))",
+ 1.0,
+ "MULTILINESTRING Z ((0 0 100, 10 10 200), (20 20 300, 30 30 400))",
+ id="multilinestring_z",
+ ),
+ # Multilinestring with M
+ pytest.param(
+ "MULTILINESTRING M ((0 0 100, 10 10 200), (20 20 300, 30 30 400))",
+ 1.0,
+ "MULTILINESTRING M ((0 0 100, 10 10 200), (20 20 300, 30 30 400))",
+ id="multilinestring_m",
+ ),
+ # Multilinestring with ZM
+ pytest.param(
+ "MULTILINESTRING ZM ((0 0 100 1000, 10 10 200 2000), "
+ "(20 20 300 3000, 30 30 400 4000))",
+ 1.0,
+ "MULTILINESTRING ZM ((0 0 100 1000, 10 10 200 2000), "
+ "(20 20 300 3000, 30 30 400 4000))",
+ id="multilinestring_zm",
+ ),
+ ],
+)
+def test_st_reduceprecision_zm(eng, geog, grid_size, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_ReducePrecision({geog_or_null(geog)}, {val_or_null(grid_size)})",
+ expected,
+ wkt_precision=15,
+ )
+
+
+# ST_Simplify tests - simplifies geometry by removing vertices
+@pytest.mark.parametrize("eng", [SedonaDB, BigQuery])
+@pytest.mark.parametrize(
+ ("geog", "tolerance", "expected"),
+ [
+ # Null inputs
+ pytest.param(None, 0.0, None, id="null_geom"),
+ pytest.param("POINT (0 0)", None, None, id="null_tolerance"),
+ # Point: unaffected by simplification (no edges)
+ pytest.param("POINT (0 0)", 0.0, "POINT (0 0)", id="point_zero_tolerance"),
+ pytest.param(
+ "POINT (0 0)", 1000000.0, "POINT (0 0)", id="point_large_tolerance"
+ ),
+ # Multipoint: zero tolerance preserves all points
+ pytest.param(
+ "MULTIPOINT ((0 0), (10 10))",
+ 0.0,
+ "MULTIPOINT (0 0, 10 10)",
+ id="multipoint_zero_tolerance",
+ ),
+ # Multipoint: large tolerance merges nearby points
+ pytest.param(
+ "MULTIPOINT ((0 0), (0.001 0.001))",
+ 1000000.0,
+ "POINT (0 0)",
+ id="multipoint_merge",
+ ),
+ # Linestring: zero tolerance is identity
+ pytest.param(
+ "LINESTRING (0 0, 10 0)",
+ 0.0,
+ "LINESTRING (0 0, 10 0)",
+ id="linestring_zero_tolerance",
+ ),
+ # Linestring: zero tolerance preserves intermediate vertex
+ pytest.param(
+ "LINESTRING (0 0, 5 1, 10 0)",
+ 0.0,
+ "LINESTRING (0 0, 5 1, 10 0)",
+ id="linestring_zero_tolerance_3pt",
+ ),
+ # Linestring: large tolerance removes intermediate vertex
+ pytest.param(
+ "LINESTRING (0 0, 5 1, 10 0)",
+ 200000.0,
+ "LINESTRING (0 0, 10 0)",
+ id="linestring_simplify",
+ ),
+ # Linestring: small tolerance keeps intermediate vertex
+ pytest.param(
+ "LINESTRING (0 0, 5 1, 10 0)",
+ 50000.0,
+ "LINESTRING (0 0, 5 1, 10 0)",
+ id="linestring_keep_vertex",
+ ),
+ ],
+)
+def test_st_simplify(eng, geog, tolerance, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Simplify({geog_or_null(geog)}, {val_or_null(tolerance)})",
+ expected,
+ wkt_precision=6,
+ )
+
+
+# Z/M/ZM support only in SedonaDB
+@pytest.mark.parametrize("eng", [SedonaDB])
+@pytest.mark.parametrize(
+ ("geog", "tolerance", "expected"),
+ [
+ pytest.param("POINT Z (0 1 10)", 0.0, "POINT Z (0 1 10)", id="point_z"),
+ pytest.param("POINT M (0 1 10)", 0.0, "POINT M (0 1 10)", id="point_m"),
+ pytest.param(
+ "POINT ZM (0 1 10 100)", 0.0, "POINT ZM (0 1 10 100)", id="point_zm"
+ ),
+ ],
+)
+def test_st_simplify_zm(eng, geog, tolerance, expected):
+ eng = eng.create_or_skip()
+ eng.assert_query_result(
+ f"SELECT ST_Simplify({geog_or_null(geog)}, {val_or_null(tolerance)})",
+ expected,
+ wkt_precision=15,
+ )
diff --git a/rust/sedona-functions/src/st_points.rs b/rust/sedona-functions/src/st_points.rs
index bee52455b..c7baf184d 100644
--- a/rust/sedona-functions/src/st_points.rs
+++ b/rust/sedona-functions/src/st_points.rs
@@ -116,7 +116,7 @@ struct STNPoints;
impl SedonaScalarKernel for STNPoints {
fn return_type(&self, args: &[SedonaType]) -> Result<Option<SedonaType>> {
let matcher = ArgMatcher::new(
- vec![ArgMatcher::is_geometry()],
+ vec![ArgMatcher::is_geometry_or_geography()],
SedonaType::Arrow(DataType::UInt64),
);