Skip to content

Commit a7da055

Browse files
committed
[task #5568] add_to_unixtime_function
Signed-off-by: tangruilin <[email protected]>
1 parent 10d5f2d commit a7da055

File tree

8 files changed

+57
-0
lines changed

8 files changed

+57
-0
lines changed

datafusion/expr/src/built_in_function.rs

+8
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ pub enum BuiltinScalarFunction {
277277
FromUnixtime,
278278
/// to_date
279279
ToDate,
280+
/// to_unixtime
281+
ToUnixtime,
280282
///now
281283
Now,
282284
///current_date
@@ -475,6 +477,7 @@ impl BuiltinScalarFunction {
475477
BuiltinScalarFunction::Struct => Volatility::Immutable,
476478
BuiltinScalarFunction::FromUnixtime => Volatility::Immutable,
477479
BuiltinScalarFunction::ToDate => Volatility::Immutable,
480+
BuiltinScalarFunction::ToUnixtime => Volatility::Immutable,
478481
BuiltinScalarFunction::ArrowTypeof => Volatility::Immutable,
479482
BuiltinScalarFunction::OverLay => Volatility::Immutable,
480483
BuiltinScalarFunction::Levenshtein => Volatility::Immutable,
@@ -785,6 +788,7 @@ impl BuiltinScalarFunction {
785788
BuiltinScalarFunction::ToTimestampSeconds => Ok(Timestamp(Second, None)),
786789
BuiltinScalarFunction::FromUnixtime => Ok(Timestamp(Second, None)),
787790
BuiltinScalarFunction::ToDate => Ok(Date32),
791+
BuiltinScalarFunction::ToUnixtime => Ok(Int64),
788792
BuiltinScalarFunction::Now => {
789793
Ok(Timestamp(Nanosecond, Some("+00:00".into())))
790794
}
@@ -1063,6 +1067,9 @@ impl BuiltinScalarFunction {
10631067
Signature::uniform(1, vec![Int64], self.volatility())
10641068
}
10651069
BuiltinScalarFunction::ToDate => Signature::variadic_any(self.volatility()),
1070+
BuiltinScalarFunction::ToUnixtime => {
1071+
Signature::variadic_any(self.volatility())
1072+
}
10661073
BuiltinScalarFunction::Digest => Signature::one_of(
10671074
vec![
10681075
Exact(vec![Utf8, Utf8]),
@@ -1496,6 +1503,7 @@ impl BuiltinScalarFunction {
14961503
BuiltinScalarFunction::ToTimestampNanos => &["to_timestamp_nanos"],
14971504
BuiltinScalarFunction::FromUnixtime => &["from_unixtime"],
14981505
BuiltinScalarFunction::ToDate => &["to_date"],
1506+
BuiltinScalarFunction::ToUnixtime => &["to_unixtime"],
14991507

15001508
// hashing functions
15011509
BuiltinScalarFunction::Digest => &["digest"],

datafusion/physical-expr/src/datetime_expressions.rs

+26
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ use datafusion_common::{
5858
ScalarValue,
5959
};
6060
use datafusion_expr::ColumnarValue;
61+
use petgraph::visit::Data;
62+
use uuid::timestamp;
6163

6264
use crate::expressions::cast_column;
6365

@@ -1878,6 +1880,30 @@ pub fn from_unixtime_invoke(args: &[ColumnarValue]) -> Result<ColumnarValue> {
18781880
}
18791881
}
18801882

1883+
/// to_unixtime() SQL function implementation
1884+
pub fn to_unixtime_invoke(args: &[ColumnarValue]) -> Result<ColumnarValue> {
1885+
if args.len() != 1 {
1886+
return exec_err!(
1887+
"to_unixtime function require 1 argument, get {}",
1888+
args.len()
1889+
);
1890+
}
1891+
1892+
match args[0].data_type() {
1893+
DataType::Null | DataType::Int32 | DataType::Int64 => Ok(args[0].clone()),
1894+
DataType::Timestamp(_, None) => cast_column(&args[0], &DataType::Int64, None),
1895+
DataType::Utf8 => {
1896+
cast_column(&to_timestamp_seconds(args)?, &DataType::Int64, None)
1897+
}
1898+
other => {
1899+
exec_err!(
1900+
"Unsupported data type {:?} for function to_unixtime function",
1901+
other
1902+
)
1903+
}
1904+
}
1905+
}
1906+
18811907
#[cfg(test)]
18821908
mod tests {
18831909
use std::sync::Arc;

datafusion/physical-expr/src/functions.rs

+3
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,9 @@ pub fn create_physical_fun(
523523
BuiltinScalarFunction::FromUnixtime => {
524524
Arc::new(datetime_expressions::from_unixtime_invoke)
525525
}
526+
BuiltinScalarFunction::ToUnixtime => {
527+
Arc::new(datetime_expressions::to_unixtime_invoke)
528+
}
526529
BuiltinScalarFunction::ToDate => Arc::new(datetime_expressions::to_date_invoke),
527530
BuiltinScalarFunction::InitCap => Arc::new(|args| match args[0].data_type() {
528531
DataType::Utf8 => {

datafusion/proto/proto/datafusion.proto

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
3+
34
* Licensed to the Apache Software Foundation (ASF) under one
45
* or more contributor license agreements. See the NOTICE file
56
* distributed with this work for additional information
@@ -684,6 +685,7 @@ enum ScalarFunction {
684685
RegexpLike = 135;
685686
ToChar = 136;
686687
ToDate = 137;
688+
ToUnixtime = 138;
687689
}
688690

689691
message ScalarFunctionNode {

datafusion/proto/src/generated/pbjson.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/proto/src/generated/prost.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/proto/src/logical_plan/from_proto.rs

+11
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
571571
ScalarFunction::SubstrIndex => Self::SubstrIndex,
572572
ScalarFunction::FindInSet => Self::FindInSet,
573573
ScalarFunction::ToDate => Self::ToDate,
574+
ScalarFunction::ToUnixtime => Self::ToUnixtime,
574575
}
575576
}
576577
}
@@ -1821,6 +1822,16 @@ pub fn parse_expr(
18211822
args,
18221823
)))
18231824
}
1825+
ScalarFunction::ToUnixtime => {
1826+
let args: Vec<_> = args
1827+
.iter()
1828+
.map(|expr| parse_expr(expr, registry))
1829+
.collect::<std::result::Result<_, _>>()?;
1830+
Ok(Expr::ScalarFunction(expr::ScalarFunction::new(
1831+
BuiltinScalarFunction::ToUnixtime,
1832+
args,
1833+
)))
1834+
}
18241835
}
18251836
}
18261837
ExprType::ScalarUdfExpr(protobuf::ScalarUdfExprNode { fun_name, args }) => {

datafusion/proto/src/logical_plan/to_proto.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction {
15501550
BuiltinScalarFunction::SubstrIndex => Self::SubstrIndex,
15511551
BuiltinScalarFunction::FindInSet => Self::FindInSet,
15521552
BuiltinScalarFunction::ToDate => Self::ToDate,
1553+
BuiltinScalarFunction::ToUnixtime => Self::ToUnixtime,
15531554
};
15541555

15551556
Ok(scalar_function)

0 commit comments

Comments
 (0)