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),
         );