Skip to content

Commit b46f0d8

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

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

datafusion/expr/src/built_in_function.rs

Lines changed: 8 additions & 0 deletions
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

Lines changed: 26 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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 {

0 commit comments

Comments
 (0)