#pragma once #include #include namespace DB { namespace Setting { extern const SettingsBool enable_extended_results_for_datetime_functions; } namespace ErrorCodes { extern const int ILLEGAL_TYPE_OF_ARGUMENT; } template class FunctionCustomWeekToDateOrDate32 : public IFunctionCustomWeek { private: const bool enable_extended_results_for_datetime_functions = false; public: static FunctionPtr create(ContextPtr context) { return std::make_shared(context); } explicit FunctionCustomWeekToDateOrDate32(ContextPtr context) : enable_extended_results_for_datetime_functions(context->getSettingsRef()[Setting::enable_extended_results_for_datetime_functions]) { } DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override { this->checkArguments(arguments, /*is_result_type_date_or_date32*/ true, Transform::value_may_be_string); const IDataType * from_type = arguments[0].type.get(); WhichDataType which(from_type); if ((which.isDate32() || which.isDateTime64()) && enable_extended_results_for_datetime_functions) return std::make_shared(); return std::make_shared(); } ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count) const override { const IDataType * from_type = arguments[0].type.get(); WhichDataType which(from_type); if (which.isDate()) return CustomWeekTransformImpl::execute(arguments, result_type, input_rows_count, Transform{}); if (which.isDate32()) { if (enable_extended_results_for_datetime_functions) return CustomWeekTransformImpl::execute( arguments, result_type, input_rows_count, Transform{}); return CustomWeekTransformImpl::execute(arguments, result_type, input_rows_count, Transform{}); } if (which.isDateTime()) return CustomWeekTransformImpl::execute(arguments, result_type, input_rows_count, Transform{}); if (which.isDateTime64()) { if (enable_extended_results_for_datetime_functions) return CustomWeekTransformImpl::execute( arguments, result_type, input_rows_count, TransformDateTime64{assert_cast(from_type)->getScale()}); return CustomWeekTransformImpl::execute( arguments, result_type, input_rows_count, TransformDateTime64{assert_cast(from_type)->getScale()}); } if (Transform::value_may_be_string && which.isString()) return CustomWeekTransformImpl::execute( arguments, result_type, input_rows_count, Transform{}); // TODO throw Exception( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument of function {}", arguments[0].type->getName(), this->getName()); } }; }