diff --git a/src/compute-types/tests/snapshots/func_registry.json b/src/compute-types/tests/snapshots/func_registry.json index 3d9ec246daee0..7c9745d109b10 100644 --- a/src/compute-types/tests/snapshots/func_registry.json +++ b/src/compute-types/tests/snapshots/func_registry.json @@ -461,8 +461,8 @@ "crc32_string": {"variant":"Crc32String","propagates_nulls":true,"introduces_nulls":false,"could_error":false,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["String:NotNull"],"output_type":"UInt32:NotNull","sqlfunc_signature":"fn(&'a str) -> u32"}, "date_part_interval": {"variant":"DatePartInterval","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Interval:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, "date_part_interval[month]": {"variant":"DatePartInterval","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Interval:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, - "date_part_time": {"variant":"DatePartTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, - "date_part_time[minute]": {"variant":"DatePartTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, + "date_part_time": {"variant":"DatePartTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":"fn(NaiveTime) -> Result"}, + "date_part_time[minute]": {"variant":"DatePartTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":"fn(NaiveTime) -> Result"}, "date_part_timestamp": {"variant":"DatePartTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, "date_part_timestamp[month]": {"variant":"DatePartTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, "date_part_timestamp_tz": {"variant":"DatePartTimestampTz","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["TimestampTz { precision: None }:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":null}, @@ -476,8 +476,8 @@ "extract_date[month]": {"variant":"ExtractDate","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Date:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":"fn(Date) -> Result"}, "extract_interval": {"variant":"ExtractInterval","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Interval:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, "extract_interval[month]": {"variant":"ExtractInterval","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Interval:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, - "extract_time": {"variant":"ExtractTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, - "extract_time[minute]": {"variant":"ExtractTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, + "extract_time": {"variant":"ExtractTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":"fn(NaiveTime) -> Result"}, + "extract_time[minute]": {"variant":"ExtractTime","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":"fn(NaiveTime) -> Result"}, "extract_timestamp": {"variant":"ExtractTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":true,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, "extract_timestamp[month]": {"variant":"ExtractTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, "extract_timestamp_tz": {"variant":"ExtractTimestampTz","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":true,"is_eliminable_cast":false,"inverse":null,"input_types":["TimestampTz { precision: None }:NotNull"],"output_type":"Numeric { max_scale: None }:NotNull","sqlfunc_signature":null}, @@ -566,7 +566,7 @@ "step_mz_timestamp": {"variant":"StepMzTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":true,"is_monotone":true,"is_eliminable_cast":false,"inverse":null,"input_types":["MzTimestamp:NotNull"],"output_type":"MzTimestamp:NotNull","sqlfunc_signature":"fn(Timestamp) -> Result"}, "tan": {"variant":"Tan","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Float64:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":"fn(f64) -> Result"}, "tanh": {"variant":"Tanh","propagates_nulls":true,"introduces_nulls":false,"could_error":false,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Float64:NotNull"],"output_type":"Float64:NotNull","sqlfunc_signature":"fn(f64) -> f64"}, - "timezone_time": {"variant":"TimezoneTime","propagates_nulls":true,"introduces_nulls":false,"could_error":false,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Time:NotNull","sqlfunc_signature":null}, + "timezone_time": {"variant":"TimezoneTime","propagates_nulls":true,"introduces_nulls":false,"could_error":false,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Time:NotNull"],"output_type":"Time:NotNull","sqlfunc_signature":"fn(NaiveTime) -> NaiveTime"}, "timezone_timestamp": {"variant":"TimezoneTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"TimestampTz { precision: None }:NotNull","sqlfunc_signature":null}, "timezone_timestamp_tz": {"variant":"TimezoneTimestampTz","propagates_nulls":true,"introduces_nulls":false,"could_error":true,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["TimestampTz { precision: None }:NotNull"],"output_type":"Timestamp { precision: None }:NotNull","sqlfunc_signature":null}, "to_char_timestamp": {"variant":"ToCharTimestamp","propagates_nulls":true,"introduces_nulls":false,"could_error":false,"preserves_uniqueness":false,"is_monotone":false,"is_eliminable_cast":false,"inverse":null,"input_types":["Timestamp { precision: None }:NotNull"],"output_type":"String:NotNull","sqlfunc_signature":null}, diff --git a/src/compute-types/tests/snapshots/func_registry_digests.json b/src/compute-types/tests/snapshots/func_registry_digests.json index 6976d77c42ed0..83b2f9a998eab 100644 --- a/src/compute-types/tests/snapshots/func_registry_digests.json +++ b/src/compute-types/tests/snapshots/func_registry_digests.json @@ -1,3 +1,3 @@ { - "1": "sha256:32a2b493356a458eb2b03362699c55f73ad99d456084d470fae8f2062381dae8" + "1": "sha256:1b04dea7e9d3848e5734fac4e8958f04816ce7ae94e0b6e2dff10d8489d2a827" } diff --git a/src/compute-types/tests/snapshots/func_registry_source.json b/src/compute-types/tests/snapshots/func_registry_source.json index da9882f221b1e..702a070fda949 100644 --- a/src/compute-types/tests/snapshots/func_registry_source.json +++ b/src/compute-types/tests/snapshots/func_registry_source.json @@ -461,8 +461,8 @@ "crc32_string": {"display":"crc32_string","sqlfunc_decl":"#[sqlfunc(sqlname = \"crc32_string\")] fn crc32_string<'a>(a: &'a str) -> u32","body_fingerprint":"4631c75e8ce6652d"}, "date_part_interval": {"display":"date_part_epoch_iv","sqlfunc_decl":null,"body_fingerprint":null}, "date_part_interval[month]": {"display":"date_part_month_iv","sqlfunc_decl":null,"body_fingerprint":null}, - "date_part_time": {"display":"date_part_epoch_t","sqlfunc_decl":null,"body_fingerprint":null}, - "date_part_time[minute]": {"display":"date_part_minute_t","sqlfunc_decl":null,"body_fingerprint":null}, + "date_part_time": {"display":"date_part_epoch_t","sqlfunc_decl":"#[sqlfunc(DatePartTime, skip_display = true)] fn date_part_time(&self, a: NaiveTime) -> Result","body_fingerprint":"fcc22c19ab95648c"}, + "date_part_time[minute]": {"display":"date_part_minute_t","sqlfunc_decl":"#[sqlfunc(DatePartTime, skip_display = true)] fn date_part_time(&self, a: NaiveTime) -> Result","body_fingerprint":"fcc22c19ab95648c"}, "date_part_timestamp": {"display":"date_part_epoch_ts","sqlfunc_decl":null,"body_fingerprint":null}, "date_part_timestamp[month]": {"display":"date_part_month_ts","sqlfunc_decl":null,"body_fingerprint":null}, "date_part_timestamp_tz": {"display":"date_part_epoch_tstz","sqlfunc_decl":null,"body_fingerprint":null}, @@ -476,8 +476,8 @@ "extract_date[month]": {"display":"extract_month_d","sqlfunc_decl":"#[sqlfunc(ExtractDate, skip_display = true, is_monotone = most_significant_unit(self.0))] fn extract_date(&self, a: Date) -> Result","body_fingerprint":"b7a5fb71cbb7611d"}, "extract_interval": {"display":"extract_epoch_iv","sqlfunc_decl":null,"body_fingerprint":null}, "extract_interval[month]": {"display":"extract_month_iv","sqlfunc_decl":null,"body_fingerprint":null}, - "extract_time": {"display":"extract_epoch_t","sqlfunc_decl":null,"body_fingerprint":null}, - "extract_time[minute]": {"display":"extract_minute_t","sqlfunc_decl":null,"body_fingerprint":null}, + "extract_time": {"display":"extract_epoch_t","sqlfunc_decl":"#[sqlfunc(ExtractTime, skip_display = true)] fn extract_time(&self, a: NaiveTime) -> Result","body_fingerprint":"fcc22c19ab95648c"}, + "extract_time[minute]": {"display":"extract_minute_t","sqlfunc_decl":"#[sqlfunc(ExtractTime, skip_display = true)] fn extract_time(&self, a: NaiveTime) -> Result","body_fingerprint":"fcc22c19ab95648c"}, "extract_timestamp": {"display":"extract_epoch_ts","sqlfunc_decl":null,"body_fingerprint":null}, "extract_timestamp[month]": {"display":"extract_month_ts","sqlfunc_decl":null,"body_fingerprint":null}, "extract_timestamp_tz": {"display":"extract_epoch_tstz","sqlfunc_decl":null,"body_fingerprint":null}, @@ -566,7 +566,7 @@ "step_mz_timestamp": {"display":"step_mz_timestamp","sqlfunc_decl":"#[sqlfunc(sqlname = \"step_mz_timestamp\", preserves_uniqueness = true, is_monotone = true)] fn step_mz_timestamp(a: Timestamp) -> Result","body_fingerprint":"cc1e14a8675fe82f"}, "tan": {"display":"tan","sqlfunc_decl":"#[sqlfunc] fn tan(a: f64) -> Result","body_fingerprint":"703eab7ab7cb2dac"}, "tanh": {"display":"tanh","sqlfunc_decl":"#[sqlfunc] fn tanh(a: f64) -> f64","body_fingerprint":"3d605983be947ee2"}, - "timezone_time": {"display":"timezone_UTC_t","sqlfunc_decl":null,"body_fingerprint":null}, + "timezone_time": {"display":"timezone_UTC_t","sqlfunc_decl":"#[sqlfunc(TimezoneTime, skip_display = true)] fn timezone_time(&self, a: NaiveTime) -> NaiveTime","body_fingerprint":"7c54b096e0e3e466"}, "timezone_timestamp": {"display":"timezone_UTC_ts","sqlfunc_decl":null,"body_fingerprint":null}, "timezone_timestamp_tz": {"display":"timezone_UTC_tstz","sqlfunc_decl":null,"body_fingerprint":null}, "to_char_timestamp": {"display":"tocharts[YYYY]","sqlfunc_decl":null,"body_fingerprint":null}, diff --git a/src/expr/src/scalar/func.rs b/src/expr/src/scalar/func.rs index b36590a856006..72fea9fc3d019 100644 --- a/src/expr/src/scalar/func.rs +++ b/src/expr/src/scalar/func.rs @@ -159,14 +159,12 @@ func_name! { CastTimestampToTimestampTz => "cast_timestamp_to_timestamp_tz", CastTimestampTzToTimestamp => "cast_timestamp_tz_to_timestamp", DatePartInterval => "date_part_interval", - DatePartTime => "date_part_time", DatePartTimestamp => "date_part_timestamp", DatePartTimestampTz => "date_part_timestamp_tz", DateTruncTimestamp => "date_trunc_timestamp", DateTruncTimestampTz => "date_trunc_timestamp_tz", variadic::ErrorIfNull => "error_if_null", ExtractInterval => "extract_interval", - ExtractTime => "extract_time", ExtractTimestamp => "extract_timestamp", ExtractTimestampTz => "extract_timestamp_tz", IsLikeMatch => "is_like_match", @@ -177,7 +175,6 @@ func_name! { RegexpMatch => "regexp_match", RegexpReplace => "regexp_replace", RegexpSplitToArray => "regexp_split_to_array", - TimezoneTime => "timezone_time", TimezoneTimestamp => "timezone_timestamp", TimezoneTimestampTz => "timezone_timestamp_tz", ToCharTimestamp => "to_char_timestamp", diff --git a/src/expr/src/scalar/func/impls/time.rs b/src/expr/src/scalar/func/impls/time.rs index 849d43dbe9f05..ae11ced58f36e 100644 --- a/src/expr/src/scalar/func/impls/time.rs +++ b/src/expr/src/scalar/func/impls/time.rs @@ -16,11 +16,10 @@ use mz_repr::adt::datetime::{DateTimeField, DateTimeUnits}; use mz_repr::adt::interval::Interval; use mz_repr::adt::numeric::{DecimalLike, Numeric}; use mz_repr::adt::timestamp::TimeLike; -use mz_repr::{RowArena, SqlColumnType, SqlScalarType, strconv}; +use mz_repr::strconv; use serde::{Deserialize, Serialize}; use crate::EvalError; -use crate::scalar::func::EagerUnaryFunc; #[sqlfunc( sqlname = "time_to_text", @@ -99,17 +98,9 @@ where )] pub struct ExtractTime(pub DateTimeUnits); -impl EagerUnaryFunc for ExtractTime { - type Input<'a> = NaiveTime; - type Output<'a> = Result; - - fn call<'a>(&self, a: Self::Input<'a>, _temp_storage: &'a RowArena) -> Self::Output<'a> { - date_part_time_inner(self.0, a) - } - - fn output_sql_type(&self, input: SqlColumnType) -> SqlColumnType { - SqlScalarType::Numeric { max_scale: None }.nullable(input.nullable) - } +#[sqlfunc(ExtractTime, skip_display = true)] +fn extract_time(&self, a: NaiveTime) -> Result { + date_part_time_inner(self.0, a) } impl fmt::Display for ExtractTime { @@ -131,17 +122,9 @@ impl fmt::Display for ExtractTime { )] pub struct DatePartTime(pub DateTimeUnits); -impl EagerUnaryFunc for DatePartTime { - type Input<'a> = NaiveTime; - type Output<'a> = Result; - - fn call<'a>(&self, a: Self::Input<'a>, _temp_storage: &'a RowArena) -> Self::Output<'a> { - date_part_time_inner(self.0, a) - } - - fn output_sql_type(&self, input: SqlColumnType) -> SqlColumnType { - SqlScalarType::Float64.nullable(input.nullable) - } +#[sqlfunc(DatePartTime, skip_display = true)] +fn date_part_time(&self, a: NaiveTime) -> Result { + date_part_time_inner(self.0, a) } impl fmt::Display for DatePartTime { @@ -176,17 +159,10 @@ pub struct TimezoneTime { pub wall_time: NaiveDateTime, } -impl EagerUnaryFunc for TimezoneTime { - type Input<'a> = NaiveTime; - type Output<'a> = NaiveTime; - - fn call<'a>(&self, a: Self::Input<'a>, _temp_storage: &'a RowArena) -> Self::Output<'a> { - timezone_time(self.tz, a, &self.wall_time) - } - - fn output_sql_type(&self, input: SqlColumnType) -> SqlColumnType { - SqlScalarType::Time.nullable(input.nullable) - } +#[sqlfunc(TimezoneTime, skip_display = true)] +fn timezone_time(&self, a: NaiveTime) -> NaiveTime { + // NOTE: `self::` reaches the free function of the same name, not this method. + self::timezone_time(self.tz, a, &self.wall_time) } impl fmt::Display for TimezoneTime {