diff --git a/velox/connectors/hive/HiveConnector.cpp b/velox/connectors/hive/HiveConnector.cpp index bdf5762ae31ee..7bf68a340cd39 100644 --- a/velox/connectors/hive/HiveConnector.cpp +++ b/velox/connectors/hive/HiveConnector.cpp @@ -309,6 +309,7 @@ bool testFilters( template velox::variant convertFromString(const std::optional& value) { if (value.has_value()) { + // No need for casting if ToKind is VARCHAR or VARBINARY. if constexpr (ToKind == TypeKind::VARCHAR || ToKind == TypeKind::VARBINARY) { return velox::variant(value.value()); } diff --git a/velox/substrait/SubstraitToVeloxExpr.cpp b/velox/substrait/SubstraitToVeloxExpr.cpp index f06fb3523c511..b97301ba02519 100644 --- a/velox/substrait/SubstraitToVeloxExpr.cpp +++ b/velox/substrait/SubstraitToVeloxExpr.cpp @@ -453,18 +453,6 @@ SubstraitVeloxExprConverter::toVeloxExpr( std::vector inputs{ toVeloxExpr(castExpr.input(), inputType)}; - - // TODO: refactor this part for input type validation. - for (const auto& input : inputs) { - switch (input->type()->kind()) { - case TypeKind::ARRAY: { - // Cast from array type is not supported. See CastExpr::applyCast. - VELOX_UNSUPPORTED("Invalid from type in casting: {}", input->type()); - } - default: { - } - } - } return std::make_shared(type, inputs, nullOnFailure); } diff --git a/velox/substrait/SubstraitToVeloxPlanValidator.cpp b/velox/substrait/SubstraitToVeloxPlanValidator.cpp index 8bab61c95b476..e0a74849319dd 100644 --- a/velox/substrait/SubstraitToVeloxPlanValidator.cpp +++ b/velox/substrait/SubstraitToVeloxPlanValidator.cpp @@ -94,6 +94,28 @@ bool SubstraitToVeloxPlanValidator::validateLiteral( return true; } +bool SubstraitToVeloxPlanValidator::validateCast( + const ::substrait::Expression::Cast& castExpr, + const RowTypePtr& inputType) { + std::vector inputs{ + exprConverter_->toVeloxExpr(castExpr.input(), inputType)}; + + // Casting from some types is not supported. See CastExpr::applyCast. + for (const auto& input : inputs) { + switch (input->type()->kind()) { + case TypeKind::ARRAY: + case TypeKind::MAP: + case TypeKind::ROW: + case TypeKind::VARBINARY: + VLOG(1) << "Invalid input type in casting: " << input->type() << "."; + return false; + default: { + } + } + } + return true; +} + bool SubstraitToVeloxPlanValidator::validateExpression( const ::substrait::Expression& expression, const RowTypePtr& inputType) { @@ -104,6 +126,8 @@ bool SubstraitToVeloxPlanValidator::validateExpression( return validateScalarFunction(expression.scalar_function(), inputType); case ::substrait::Expression::RexTypeCase::kLiteral: return validateLiteral(expression.literal(), inputType); + case ::substrait::Expression::RexTypeCase::kCast: + return validateCast(expression.cast(), inputType); default: return true; } diff --git a/velox/substrait/SubstraitToVeloxPlanValidator.h b/velox/substrait/SubstraitToVeloxPlanValidator.h index de13173ebf27b..5bb405afe62dd 100644 --- a/velox/substrait/SubstraitToVeloxPlanValidator.h +++ b/velox/substrait/SubstraitToVeloxPlanValidator.h @@ -101,6 +101,11 @@ class SubstraitToVeloxPlanValidator { const ::substrait::Expression::ScalarFunction& scalarFunction, const RowTypePtr& inputType); + /// Validate Substrait Cast expression. + bool validateCast( + const ::substrait::Expression::Cast& castExpr, + const RowTypePtr& inputType); + /// Validate Substrait expression. bool validateExpression( const ::substrait::Expression& expression,