@@ -221,6 +221,22 @@ struct ST_Transform {
221221 auto &data = other.Cast <TypedBindData>();
222222 return normalize == data.normalize && source_crs == data.source_crs && target_crs == data.target_crs ;
223223 }
224+
225+ static void Serialize (Serializer &serializer, const optional_ptr<FunctionData> bind_data_p,
226+ const ScalarFunction &function) {
227+ auto &bind_data = bind_data_p->Cast <TypedBindData>();
228+ serializer.WritePropertyWithDefault (100 , " normalize" , bind_data.normalize );
229+ serializer.WritePropertyWithDefault (101 , " source" , bind_data.source_crs );
230+ serializer.WritePropertyWithDefault (102 , " target" , bind_data.target_crs );
231+ }
232+
233+ static unique_ptr<FunctionData> Deserialize (Deserializer &deserializer, ScalarFunction &function) {
234+ auto result = make_uniq<TypedBindData>();
235+ deserializer.ReadPropertyWithDefault (100 , " normalize" , result->normalize );
236+ deserializer.ReadPropertyWithDefault (101 , " source" , result->source_crs );
237+ deserializer.ReadPropertyWithDefault (102 , " target" , result->target_crs );
238+ return std::move (result);
239+ }
224240 };
225241
226242 static unique_ptr<FunctionData> BindTyped (ClientContext &ctx, ScalarFunction &func,
@@ -309,6 +325,7 @@ struct ST_Transform {
309325 return std::move (result);
310326 }
311327
328+
312329 // ------------------------------------------------------------------------------------------------------------------
313330 // Local State
314331 // ------------------------------------------------------------------------------------------------------------------
@@ -655,6 +672,8 @@ struct ST_Transform {
655672
656673 variant.SetInit (LocalState::Init);
657674 variant.SetBind (BindTyped);
675+ variant.SetSerialize (TypedBindData::Serialize);
676+ variant.SetDeserialize (TypedBindData::Deserialize);
658677 variant.SetFunction (ExecuteGeometryTyped);
659678 variant.CanThrowErrors ();
660679 });
@@ -667,6 +686,8 @@ struct ST_Transform {
667686
668687 variant.SetInit (LocalState::Init);
669688 variant.SetBind (BindTyped);
689+ variant.SetSerialize (TypedBindData::Serialize);
690+ variant.SetDeserialize (TypedBindData::Deserialize);
670691 variant.SetFunction (ExecuteGeometryTyped);
671692 variant.CanThrowErrors ();
672693 });
@@ -1389,13 +1410,25 @@ struct ST_DWithin_Spheroid {
13891410 geod_geodesic geod = {};
13901411 geod_init (&geod, EARTH_A, EARTH_F);
13911412
1392- GenericExecutor::ExecuteTernary<POINT_TYPE, POINT_TYPE, DISTANCE_TYPE, BOOL_TYPE>(
1393- args.data [0 ], args.data [1 ], args.data [2 ], result, args.size (),
1394- [&](const POINT_TYPE &p1, const POINT_TYPE &p2, const DISTANCE_TYPE &limit) {
1395- double distance;
1396- geod_inverse (&geod, p1.a_val , p1.b_val , p2.a_val , p2.b_val , &distance, nullptr , nullptr );
1397- return distance <= limit.val ;
1398- });
1413+ const auto &bdata = state.expr .Cast <BoundFunctionExpression>().bind_info ->Cast <GeodesicBindData>();
1414+
1415+ if (bdata.always_xy ) {
1416+ GenericExecutor::ExecuteTernary<POINT_TYPE, POINT_TYPE, DISTANCE_TYPE, BOOL_TYPE>(
1417+ args.data [0 ], args.data [1 ], args.data [2 ], result, args.size (),
1418+ [&](const POINT_TYPE &p1, const POINT_TYPE &p2, const DISTANCE_TYPE &limit) {
1419+ double distance;
1420+ geod_inverse (&geod, p1.b_val , p1.a_val , p2.b_val , p2.a_val , &distance, nullptr , nullptr );
1421+ return distance <= limit.val ;
1422+ });
1423+ } else {
1424+ GenericExecutor::ExecuteTernary<POINT_TYPE, POINT_TYPE, DISTANCE_TYPE, BOOL_TYPE>(
1425+ args.data [0 ], args.data [1 ], args.data [2 ], result, args.size (),
1426+ [&](const POINT_TYPE &p1, const POINT_TYPE &p2, const DISTANCE_TYPE &limit) {
1427+ double distance;
1428+ geod_inverse (&geod, p1.a_val , p1.b_val , p2.a_val , p2.b_val , &distance, nullptr , nullptr );
1429+ return distance <= limit.val ;
1430+ });
1431+ }
13991432 }
14001433
14011434 static constexpr auto DESCRIPTION = R"(
@@ -1414,6 +1447,7 @@ struct ST_DWithin_Spheroid {
14141447 variant.AddParameter (" p2" , GeoTypes::POINT_2D ());
14151448 variant.AddParameter (" distance" , LogicalType::DOUBLE);
14161449 variant.SetReturnType (LogicalType::BOOLEAN);
1450+ variant.SetBind (GeodesicBindData::Bind);
14171451
14181452 variant.SetFunction (Execute);
14191453 variant.CanThrowErrors ();
0 commit comments