From 682403d13b66322177eb32c470c6ca415f460c1b Mon Sep 17 00:00:00 2001 From: Esteban Zimanyi Date: Thu, 11 Jun 2026 00:34:37 +0200 Subject: [PATCH] feat(tfloat): bind sin/cos/tan as overloads on TFLOAT; bump MEOS pin to 59ba0ad59c Wire `tfloat_sin`, `tfloat_cos`, `tfloat_tan` from MEOS as `sin(tfloat)`, `cos(tfloat)`, `tan(tfloat)` DuckDB scalar overloads, following the same `TemporalUnary` pattern as `exp`/`ln`/`log10`. The pin advances from `278863520b` to `59ba0ad59c` (tag `ecosystem-pin-2026-06-11a`), which adds these three trig kernels and the `ensure_srid_reconcile` helper. --- src/include/temporal/temporal_functions.hpp | 3 ++ src/temporal/temporal.cpp | 3 ++ src/temporal/temporal_functions.cpp | 12 +++++ test/sql/parity/026c_tfloat_trig.test | 56 +++++++++++++++++++++ vcpkg_ports/meos/portfile.cmake | 4 +- 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 test/sql/parity/026c_tfloat_trig.test diff --git a/src/include/temporal/temporal_functions.hpp b/src/include/temporal/temporal_functions.hpp index bbb895c3..6a791493 100644 --- a/src/include/temporal/temporal_functions.hpp +++ b/src/include/temporal/temporal_functions.hpp @@ -232,6 +232,9 @@ struct TemporalFunctions { static void Tfloat_exp(DataChunk &args, ExpressionState &state, Vector &result); static void Tfloat_ln(DataChunk &args, ExpressionState &state, Vector &result); static void Tfloat_log10(DataChunk &args, ExpressionState &state, Vector &result); + static void Tfloat_sin(DataChunk &args, ExpressionState &state, Vector &result); + static void Tfloat_cos(DataChunk &args, ExpressionState &state, Vector &result); + static void Tfloat_tan(DataChunk &args, ExpressionState &state, Vector &result); // Temporal_derivative declared in the math-functions block below. static void Tfloat_degrees(DataChunk &args, ExpressionState &state, Vector &result); static void Tfloat_radians(DataChunk &args, ExpressionState &state, Vector &result); diff --git a/src/temporal/temporal.cpp b/src/temporal/temporal.cpp index 9abf2973..b5c59d9e 100644 --- a/src/temporal/temporal.cpp +++ b/src/temporal/temporal.cpp @@ -1367,6 +1367,9 @@ void TemporalTypes::RegisterScalarFunctions(ExtensionLoader &loader) { duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("exp", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_exp)); duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("ln", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_ln)); duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("log10", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_log10)); + duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("sin", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_sin)); + duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("cos", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_cos)); + duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("tan", {TemporalTypes::TFLOAT()}, TemporalTypes::TFLOAT(), TemporalFunctions::Tfloat_tan)); // deltaValue / trend on tnumber duckdb::RegisterSerializedScalarFunction(loader, ScalarFunction("deltaValue", {TemporalTypes::TINT()}, TemporalTypes::TINT(), TemporalFunctions::Tnumber_delta_value)); diff --git a/src/temporal/temporal_functions.cpp b/src/temporal/temporal_functions.cpp index fc8a2b68..5b110e00 100644 --- a/src/temporal/temporal_functions.cpp +++ b/src/temporal/temporal_functions.cpp @@ -4816,6 +4816,18 @@ void TemporalFunctions::Tfloat_log10(DataChunk &args, ExpressionState &state, Ve TemporalUnary(args, result, [](Temporal *t) { return tfloat_log10(t); }); } +void TemporalFunctions::Tfloat_sin(DataChunk &args, ExpressionState &state, Vector &result) { + TemporalUnary(args, result, [](Temporal *t) { return tfloat_sin(t); }); +} + +void TemporalFunctions::Tfloat_cos(DataChunk &args, ExpressionState &state, Vector &result) { + TemporalUnary(args, result, [](Temporal *t) { return tfloat_cos(t); }); +} + +void TemporalFunctions::Tfloat_tan(DataChunk &args, ExpressionState &state, Vector &result) { + TemporalUnary(args, result, [](Temporal *t) { return tfloat_tan(t); }); +} + namespace { template diff --git a/test/sql/parity/026c_tfloat_trig.test b/test/sql/parity/026c_tfloat_trig.test new file mode 100644 index 00000000..1ede88d3 --- /dev/null +++ b/test/sql/parity/026c_tfloat_trig.test @@ -0,0 +1,56 @@ +# name: test/sql/parity/026c_tfloat_trig.test +# description: Trigonometric lifts for tfloat — sin, cos, tan. +# group: [sql] + +require mobilityduck + +# Instant: sin(0) = 0 +query I +SELECT sin(tfloat '[0@2000-01-01]'); +---- +[0@2000-01-01 00:00:00+01] + +# Instant: cos(0) = 1 +query I +SELECT cos(tfloat '[0@2000-01-01]'); +---- +[1@2000-01-01 00:00:00+01] + +# Instant: tan(0) = 0 +query I +SELECT tan(tfloat '[0@2000-01-01]'); +---- +[0@2000-01-01 00:00:00+01] + +# Sequence endpoints: sin lifted over [0, pi/2] starts at 0 and ends at 1 +query I +SELECT round(startValue(sin(tfloat '[0@2000-01-01, 1.5707963267948966@2000-01-02]')), 6); +---- +0.0 + +query I +SELECT round(endValue(sin(tfloat '[0@2000-01-01, 1.5707963267948966@2000-01-02]')), 6); +---- +1.0 + +# Sequence endpoints: cos lifted over [0, pi/2] starts at 1 and ends at 0 +query I +SELECT round(startValue(cos(tfloat '[0@2000-01-01, 1.5707963267948966@2000-01-02]')), 6); +---- +1.0 + +query I +SELECT round(endValue(cos(tfloat '[0@2000-01-01, 1.5707963267948966@2000-01-02]')), 6); +---- +0.0 + +# Sequence endpoints: tan lifted over [0, pi/4] starts at 0 and ends at 1 +query I +SELECT round(startValue(tan(tfloat '[0@2000-01-01, 0.7853981633974483@2000-01-02]')), 6); +---- +0.0 + +query I +SELECT round(endValue(tan(tfloat '[0@2000-01-01, 0.7853981633974483@2000-01-02]')), 6); +---- +1.0 diff --git a/vcpkg_ports/meos/portfile.cmake b/vcpkg_ports/meos/portfile.cmake index fd0da052..738c9f17 100644 --- a/vcpkg_ports/meos/portfile.cmake +++ b/vcpkg_ports/meos/portfile.cmake @@ -1,8 +1,8 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO estebanzimanyi/MobilityDB - REF 278863520b000b735cc361beab88387174909ed7 - SHA512 2e617cac4bfed919eee8bd73e35f9b3da8ffd7a51f68104a9497c0d3339dbb1af4a2ec6feab3e8fffb880481badf86c352ad1efb39cab533de19d2c1192a8e5b + REF 59ba0ad59cb93db6fa46929394e475b7851c00be + SHA512 e6a4a1578e5760326a596248865ccb487850120ca423f5675d1f014e9146de4f407c699afa63a102d8ba4ef1f895946d206ee4ab2f870dc4508ec2ca3d771869 ) vcpkg_replace_string(