Skip to content

Commit

Permalink
add uuid() function
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiayu Liu committed Oct 31, 2022
1 parent 0678093 commit a505622
Show file tree
Hide file tree
Showing 12 changed files with 41 additions and 3 deletions.
1 change: 1 addition & 0 deletions datafusion-cli/Cargo.lock

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

8 changes: 7 additions & 1 deletion datafusion/expr/src/built_in_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ pub enum BuiltinScalarFunction {
Trim,
/// upper
Upper,
/// uuid
Uuid,
/// regexp_match
RegexpMatch,
/// struct
Expand All @@ -176,7 +178,9 @@ impl BuiltinScalarFunction {
pub fn supports_zero_argument(&self) -> bool {
matches!(
self,
BuiltinScalarFunction::Random | BuiltinScalarFunction::Now
BuiltinScalarFunction::Random
| BuiltinScalarFunction::Now
| BuiltinScalarFunction::Uuid
)
}
/// Returns the [Volatility] of the builtin function.
Expand Down Expand Up @@ -257,6 +261,7 @@ impl BuiltinScalarFunction {

// Volatile builtin functions
BuiltinScalarFunction::Random => Volatility::Volatile,
BuiltinScalarFunction::Uuid => Volatility::Volatile,
}
}
}
Expand Down Expand Up @@ -347,6 +352,7 @@ impl FromStr for BuiltinScalarFunction {
"translate" => BuiltinScalarFunction::Translate,
"trim" => BuiltinScalarFunction::Trim,
"upper" => BuiltinScalarFunction::Upper,
"uuid" => BuiltinScalarFunction::Uuid,
"regexp_match" => BuiltinScalarFunction::RegexpMatch,
"struct" => BuiltinScalarFunction::Struct,
"from_unixtime" => BuiltinScalarFunction::FromUnixtime,
Expand Down
10 changes: 9 additions & 1 deletion datafusion/expr/src/expr_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ pub fn array(args: Vec<Expr>) -> Expr {
/// which is not NULL
pub fn coalesce(args: Vec<Expr>) -> Expr {
Expr::ScalarFunction {
fun: built_in_function::BuiltinScalarFunction::Coalesce,
fun: BuiltinScalarFunction::Coalesce,
args,
}
}
Expand All @@ -452,6 +452,14 @@ pub fn now() -> Expr {
}
}

/// Returns uuid v4 as a string
pub fn uuid() -> Expr {
Expr::ScalarFunction {
fun: BuiltinScalarFunction::Uuid,
args: vec![],
}
}

/// Create a CASE WHEN statement with literal WHEN expressions for comparison to the base expression.
pub fn case(expr: Expr) -> CaseBuilder {
CaseBuilder::new(Some(Box::new(expr)), vec![], vec![], None)
Expand Down
2 changes: 2 additions & 0 deletions datafusion/expr/src/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ pub fn return_type(
BuiltinScalarFunction::StartsWith => Ok(DataType::Boolean),
BuiltinScalarFunction::Strpos => utf8_to_int_type(&input_expr_types[0], "strpos"),
BuiltinScalarFunction::Substr => utf8_to_str_type(&input_expr_types[0], "substr"),
BuiltinScalarFunction::Uuid => Ok(DataType::Utf8),
BuiltinScalarFunction::ToHex => Ok(match input_expr_types[0] {
DataType::Int8 | DataType::Int16 | DataType::Int32 | DataType::Int64 => {
DataType::Utf8
Expand Down Expand Up @@ -578,6 +579,7 @@ pub fn signature(fun: &BuiltinScalarFunction) -> Signature {
fun.volatility(),
),
BuiltinScalarFunction::Random => Signature::exact(vec![], fun.volatility()),
BuiltinScalarFunction::Uuid => Signature::exact(vec![], fun.volatility()),
BuiltinScalarFunction::Power => Signature::one_of(
vec![
TypeSignature::Exact(vec![DataType::Int64, DataType::Int64]),
Expand Down
1 change: 1 addition & 0 deletions datafusion/physical-expr/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,4 @@ rand = "0.8"
regex = { version = "^1.4.3", optional = true }
sha2 = { version = "^0.10.1", optional = true }
unicode-segmentation = { version = "^1.7.1", optional = true }
uuid = { version = "^1.2", features = ["v4"] }
7 changes: 6 additions & 1 deletion datafusion/physical-expr/src/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,7 @@ pub fn create_physical_fun(
))),
}),
BuiltinScalarFunction::Upper => Arc::new(string_expressions::upper),
BuiltinScalarFunction::Uuid => Arc::new(string_expressions::uuid),
_ => {
return Err(DataFusionError::Internal(format!(
"create_physical_fun: Unsupported scalar function {:?}",
Expand Down Expand Up @@ -2748,7 +2749,11 @@ mod tests {
let execution_props = ExecutionProps::new();
let schema = Schema::new(vec![Field::new("a", DataType::Int32, false)]);

let funs = [BuiltinScalarFunction::Now, BuiltinScalarFunction::Random];
let funs = [
BuiltinScalarFunction::Now,
BuiltinScalarFunction::Random,
BuiltinScalarFunction::Uuid,
];

for fun in funs.iter() {
create_physical_expr_with_type_coercion(fun, &[], &schema, &execution_props)?;
Expand Down
7 changes: 7 additions & 0 deletions datafusion/physical-expr/src/string_expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ use datafusion_common::{DataFusionError, Result};
use datafusion_expr::ColumnarValue;
use std::any::type_name;
use std::sync::Arc;
use uuid::Uuid;

macro_rules! downcast_string_arg {
($ARG:expr, $NAME:expr, $T:ident) => {{
Expand Down Expand Up @@ -586,3 +587,9 @@ where
pub fn upper(args: &[ColumnarValue]) -> Result<ColumnarValue> {
handle(args, |string| string.to_ascii_uppercase(), "upper")
}

/// Prints random (v4) uuid values per row
/// uuid() = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
pub fn uuid(args: &[ColumnarValue]) -> Result<ColumnarValue> {
handle(args, |_| Uuid::new_v4().to_string(), "uuid")
}
1 change: 1 addition & 0 deletions datafusion/proto/proto/datafusion.proto
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,7 @@ enum ScalarFunction {
Atan2=67;
DateBin=68;
ArrowTypeof=69;
Uuid=70;
}

message ScalarFunctionNode {
Expand Down
1 change: 1 addition & 0 deletions datafusion/proto/src/from_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ impl From<&protobuf::ScalarFunction> for BuiltinScalarFunction {
ScalarFunction::ToTimestampMicros => Self::ToTimestampMicros,
ScalarFunction::ToTimestampSeconds => Self::ToTimestampSeconds,
ScalarFunction::Now => Self::Now,
ScalarFunction::Uuid => Self::Uuid,
ScalarFunction::Translate => Self::Translate,
ScalarFunction::RegexpMatch => Self::RegexpMatch,
ScalarFunction::Coalesce => Self::Coalesce,
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.

2 changes: 2 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.

1 change: 1 addition & 0 deletions datafusion/proto/src/to_proto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,7 @@ impl TryFrom<&BuiltinScalarFunction> for protobuf::ScalarFunction {
BuiltinScalarFunction::Left => Self::Left,
BuiltinScalarFunction::Lpad => Self::Lpad,
BuiltinScalarFunction::Random => Self::Random,
BuiltinScalarFunction::Uuid => Self::Uuid,
BuiltinScalarFunction::RegexpReplace => Self::RegexpReplace,
BuiltinScalarFunction::Repeat => Self::Repeat,
BuiltinScalarFunction::Replace => Self::Replace,
Expand Down

0 comments on commit a505622

Please sign in to comment.