Skip to content

Commit

Permalink
[task apache#5568] add_to_unixtime_function
Browse files Browse the repository at this point in the history
Signed-off-by: tangruilin <[email protected]>
  • Loading branch information
Tangruilin committed Mar 2, 2024
1 parent 10d5f2d commit 664c4b0
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 0 deletions.
8 changes: 8 additions & 0 deletions datafusion/expr/src/built_in_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,8 @@ pub enum BuiltinScalarFunction {
FromUnixtime,
/// to_date
ToDate,
/// to_unixtime
ToUnixtime,
///now
Now,
///current_date
Expand Down Expand Up @@ -475,6 +477,7 @@ impl BuiltinScalarFunction {
BuiltinScalarFunction::Struct => Volatility::Immutable,
BuiltinScalarFunction::FromUnixtime => Volatility::Immutable,
BuiltinScalarFunction::ToDate => Volatility::Immutable,
BuiltinScalarFunction::ToUnixtime => Volatility::Immutable,
BuiltinScalarFunction::ArrowTypeof => Volatility::Immutable,
BuiltinScalarFunction::OverLay => Volatility::Immutable,
BuiltinScalarFunction::Levenshtein => Volatility::Immutable,
Expand Down Expand Up @@ -785,6 +788,7 @@ impl BuiltinScalarFunction {
BuiltinScalarFunction::ToTimestampSeconds => Ok(Timestamp(Second, None)),
BuiltinScalarFunction::FromUnixtime => Ok(Timestamp(Second, None)),
BuiltinScalarFunction::ToDate => Ok(Date32),
BuiltinScalarFunction::ToUnixtime => Ok(Int64),
BuiltinScalarFunction::Now => {
Ok(Timestamp(Nanosecond, Some("+00:00".into())))
}
Expand Down Expand Up @@ -1063,6 +1067,9 @@ impl BuiltinScalarFunction {
Signature::uniform(1, vec![Int64], self.volatility())
}
BuiltinScalarFunction::ToDate => Signature::variadic_any(self.volatility()),
BuiltinScalarFunction::ToUnixtime => {
Signature::variadic_any(self.volatility())
}
BuiltinScalarFunction::Digest => Signature::one_of(
vec![
Exact(vec![Utf8, Utf8]),
Expand Down Expand Up @@ -1496,6 +1503,7 @@ impl BuiltinScalarFunction {
BuiltinScalarFunction::ToTimestampNanos => &["to_timestamp_nanos"],
BuiltinScalarFunction::FromUnixtime => &["from_unixtime"],
BuiltinScalarFunction::ToDate => &["to_date"],
BuiltinScalarFunction::ToUnixtime => &["to_unixtime"],

// hashing functions
BuiltinScalarFunction::Digest => &["digest"],
Expand Down
31 changes: 31 additions & 0 deletions datafusion/physical-expr/src/datetime_expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1878,6 +1878,37 @@ pub fn from_unixtime_invoke(args: &[ColumnarValue]) -> Result<ColumnarValue> {
}
}

/// to_unixtime() SQL function implementation
pub fn to_unixtime_invoke(args: &[ColumnarValue]) -> Result<ColumnarValue> {
if args.is_empty() {
return exec_err!(
"to_unixtime function requires 1 or more arguments, got {}",
args.len()
);
}

// validate that any args after the first one are Utf8
if args.len() > 1 {
if let Some(value) = validate_to_timestamp_data_types(args, "to_unixtime") {
return value;
}
}

match args[0].data_type() {
DataType::Null | DataType::Int32 | DataType::Int64 => Ok(args[0].clone()),
DataType::Timestamp(_, None) => cast_column(&args[0], &DataType::Int64, None),
DataType::Utf8 => {
cast_column(&to_timestamp_seconds(args)?, &DataType::Int64, None)
}
other => {
exec_err!(
"Unsupported data type {:?} for function to_unixtime function",
other
)
}
}
}

#[cfg(test)]
mod tests {
use std::sync::Arc;
Expand Down
3 changes: 3 additions & 0 deletions datafusion/physical-expr/src/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,9 @@ pub fn create_physical_fun(
BuiltinScalarFunction::FromUnixtime => {
Arc::new(datetime_expressions::from_unixtime_invoke)
}
BuiltinScalarFunction::ToUnixtime => {
Arc::new(datetime_expressions::to_unixtime_invoke)
}
BuiltinScalarFunction::ToDate => Arc::new(datetime_expressions::to_date_invoke),
BuiltinScalarFunction::InitCap => Arc::new(|args| match args[0].data_type() {
DataType::Utf8 => {
Expand Down
2 changes: 2 additions & 0 deletions datafusion/proto/proto/datafusion.proto
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* 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
Expand Down Expand Up @@ -684,6 +685,7 @@ enum ScalarFunction {
RegexpLike = 135;
ToChar = 136;
ToDate = 137;
ToUnixtime = 138;
}

message ScalarFunctionNode {
Expand Down
3 changes: 3 additions & 0 deletions datafusion/proto/src/generated/pbjson.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions datafusion/proto/src/generated/prost.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions datafusion/proto/src/logical_plan/from_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
ScalarFunction::SubstrIndex => Self::SubstrIndex,
ScalarFunction::FindInSet => Self::FindInSet,
ScalarFunction::ToDate => Self::ToDate,
ScalarFunction::ToUnixtime => Self::ToUnixtime,
}
}
}
Expand Down Expand Up @@ -1821,6 +1822,16 @@ pub fn parse_expr(
args,
)))
}
ScalarFunction::ToUnixtime => {
let args: Vec<_> = args
.iter()
.map(|expr| parse_expr(expr, registry))
.collect::<std::result::Result<_, _>>()?;
Ok(Expr::ScalarFunction(expr::ScalarFunction::new(
BuiltinScalarFunction::ToUnixtime,
args,
)))
}
}
}
ExprType::ScalarUdfExpr(protobuf::ScalarUdfExprNode { fun_name, args }) => {
Expand Down
1 change: 1 addition & 0 deletions datafusion/proto/src/logical_plan/to_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1550,6 +1550,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction {
BuiltinScalarFunction::SubstrIndex => Self::SubstrIndex,
BuiltinScalarFunction::FindInSet => Self::FindInSet,
BuiltinScalarFunction::ToDate => Self::ToDate,
BuiltinScalarFunction::ToUnixtime => Self::ToUnixtime,
};

Ok(scalar_function)
Expand Down
19 changes: 19 additions & 0 deletions datafusion/sqllogictest/test_files/timestamps.slt
Original file line number Diff line number Diff line change
Expand Up @@ -2678,3 +2678,22 @@ SELECT to_char(null, '%d-%m-%Y');

statement ok
drop table formats;

##########
## to_unixtime tests
##########

query I
select to_unixtime('2020-09-08T12:00:00+00:00');
----
1599566400

query I
select to_unixtime('01-14-2023 01:01:30+05:30', '%q', '%d-%m-%Y %H/%M/%S', '%+', '%m-%d-%Y %H:%M:%S%#z');
----
1673638290

query I
select to_unixtime('03:59:00.123456789 05-17-2023', '%c', '%+', '%H:%M:%S%.f %m-%d-%Y');
----
1684295940

0 comments on commit 664c4b0

Please sign in to comment.