mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Merge pull request #67399 from rschu1ze/frmDt-optional-format-string
formatDateTime[InJodaSyntax]: make format string optional
This commit is contained in:
commit
8370114400
@ -4922,13 +4922,13 @@ This function is the opposite operation of function [formatDateTime](../function
|
|||||||
**Syntax**
|
**Syntax**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
parseDateTime(str, format[, timezone])
|
parseDateTime(str[, format[, timezone]])
|
||||||
```
|
```
|
||||||
|
|
||||||
**Arguments**
|
**Arguments**
|
||||||
|
|
||||||
- `str` — the String to be parsed
|
- `str` — The String to be parsed
|
||||||
- `format` — the format string
|
- `format` — The format string. Optional. `%Y-%m-%d %H:%i:%s` if not specified.
|
||||||
- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional.
|
- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional.
|
||||||
|
|
||||||
**Returned value(s)**
|
**Returned value(s)**
|
||||||
@ -4971,13 +4971,13 @@ This function is the opposite operation of function [formatDateTimeInJodaSyntax]
|
|||||||
**Syntax**
|
**Syntax**
|
||||||
|
|
||||||
``` sql
|
``` sql
|
||||||
parseDateTimeInJodaSyntax(str, format[, timezone])
|
parseDateTimeInJodaSyntax(str[, format[, timezone]])
|
||||||
```
|
```
|
||||||
|
|
||||||
**Arguments**
|
**Arguments**
|
||||||
|
|
||||||
- `str` — the String to be parsed
|
- `str` — The String to be parsed
|
||||||
- `format` — the format string
|
- `format` — The format string. Optional. `yyyy-MM-dd HH:mm:ss` if not specified.
|
||||||
- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional.
|
- `timezone` — [Timezone](/docs/en/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-timezone). Optional.
|
||||||
|
|
||||||
**Returned value(s)**
|
**Returned value(s)**
|
||||||
|
@ -582,11 +582,11 @@ namespace
|
|||||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||||
{
|
{
|
||||||
FunctionArgumentDescriptors mandatory_args{
|
FunctionArgumentDescriptors mandatory_args{
|
||||||
{"time", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
{"time", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||||
{"format", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FunctionArgumentDescriptors optional_args{
|
FunctionArgumentDescriptors optional_args{
|
||||||
|
{"format", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||||
{"timezone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), &isColumnConst, "const String"}
|
{"timezone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), &isColumnConst, "const String"}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2029,14 +2029,24 @@ namespace
|
|||||||
|
|
||||||
String getFormat(const ColumnsWithTypeAndName & arguments) const
|
String getFormat(const ColumnsWithTypeAndName & arguments) const
|
||||||
{
|
{
|
||||||
const auto * format_column = checkAndGetColumnConst<ColumnString>(arguments[1].column.get());
|
if (arguments.size() == 1)
|
||||||
if (!format_column)
|
{
|
||||||
throw Exception(
|
if constexpr (parse_syntax == ParseSyntax::MySQL)
|
||||||
ErrorCodes::ILLEGAL_COLUMN,
|
return "%Y-%m-%d %H:%i:%s";
|
||||||
"Illegal column {} of second ('format') argument of function {}. Must be constant string.",
|
else
|
||||||
arguments[1].column->getName(),
|
return "yyyy-MM-dd HH:mm:ss";
|
||||||
getName());
|
}
|
||||||
return format_column->getValue<String>();
|
else
|
||||||
|
{
|
||||||
|
const auto * col_format = checkAndGetColumnConst<ColumnString>(arguments[1].column.get());
|
||||||
|
if (!col_format)
|
||||||
|
throw Exception(
|
||||||
|
ErrorCodes::ILLEGAL_COLUMN,
|
||||||
|
"Illegal column {} of second ('format') argument of function {}. Must be constant string.",
|
||||||
|
arguments[1].column->getName(),
|
||||||
|
getName());
|
||||||
|
return col_format->getValue<String>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const DateLUTImpl & getTimeZone(const ColumnsWithTypeAndName & arguments) const
|
const DateLUTImpl & getTimeZone(const ColumnsWithTypeAndName & arguments) const
|
||||||
|
@ -239,7 +239,7 @@ select sTr_To_DaTe('10:04:11 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') = toDateTi
|
|||||||
select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS NULL;
|
select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS NULL;
|
||||||
1
|
1
|
||||||
-- Error handling
|
-- Error handling
|
||||||
select parseDateTime('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTime(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
-- Fuzzer crash bug #53715
|
-- Fuzzer crash bug #53715
|
||||||
select parseDateTime('', '', toString(number)) from numbers(13); -- { serverError ILLEGAL_COLUMN }
|
select parseDateTime('', '', toString(number)) from numbers(13); -- { serverError ILLEGAL_COLUMN }
|
||||||
@ -270,3 +270,7 @@ select parseDateTime('8 13, 2022, 7:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
|||||||
2022-08-13 07:58:32
|
2022-08-13 07:58:32
|
||||||
select parseDateTime('08 13, 2022, 07:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
select parseDateTime('08 13, 2022, 07:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
||||||
2022-08-13 07:58:32
|
2022-08-13 07:58:32
|
||||||
|
-- The format string argument is optional
|
||||||
|
set session_timezone = 'UTC'; -- don't randomize the session timezone
|
||||||
|
select parseDateTime('2021-01-04 23:12:34') = toDateTime('2021-01-04 23:12:34');
|
||||||
|
1
|
||||||
|
@ -162,7 +162,7 @@ select sTr_To_DaTe('10:04:11 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') = toDateTi
|
|||||||
select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS NULL;
|
select str_to_date('10:04:11 invalid 03-07-2019', '%s:%i:%H %d-%m-%Y', 'UTC') IS NULL;
|
||||||
|
|
||||||
-- Error handling
|
-- Error handling
|
||||||
select parseDateTime('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTime(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTime('12 AM', '%h %p', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
-- Fuzzer crash bug #53715
|
-- Fuzzer crash bug #53715
|
||||||
@ -187,4 +187,9 @@ select parseDateTime('08 13, 2022, 07:58:32', '%m %e, %G, %k:%i:%s', 'UTC');
|
|||||||
select parseDateTime('8 13, 2022, 7:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
select parseDateTime('8 13, 2022, 7:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
||||||
select parseDateTime('08 13, 2022, 07:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
select parseDateTime('08 13, 2022, 07:58:32', '%c %e, %G, %k:%i:%s', 'UTC');
|
||||||
|
|
||||||
|
-- The format string argument is optional
|
||||||
|
set session_timezone = 'UTC'; -- don't randomize the session timezone
|
||||||
|
select parseDateTime('2021-01-04 23:12:34') = toDateTime('2021-01-04 23:12:34');
|
||||||
|
|
||||||
|
|
||||||
-- { echoOff }
|
-- { echoOff }
|
||||||
|
@ -354,5 +354,9 @@ select parseDateTimeInJodaSyntaxOrNull('2001 366 2000', 'yyyy D yyyy', 'UTC') =
|
|||||||
select parseDateTimeInJodaSyntaxOrNull('2001 invalid 366 2000', 'yyyy D yyyy', 'UTC') IS NULL;
|
select parseDateTimeInJodaSyntaxOrNull('2001 invalid 366 2000', 'yyyy D yyyy', 'UTC') IS NULL;
|
||||||
1
|
1
|
||||||
-- Error handling
|
-- Error handling
|
||||||
select parseDateTimeInJodaSyntax('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTimeInJodaSyntax(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
select parseDateTimeInJodaSyntax('12 AM', 'h a', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTimeInJodaSyntax('12 AM', 'h a', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
-- The format string argument is optional
|
||||||
|
set session_timezone = 'UTC'; -- don't randomize the session timezone
|
||||||
|
select parseDateTimeInJodaSyntax('2021-01-04 23:12:34') = toDateTime('2021-01-04 23:12:34');
|
||||||
|
1
|
||||||
|
@ -239,6 +239,11 @@ select parseDateTimeInJodaSyntaxOrNull('2001 366 2000', 'yyyy D yyyy', 'UTC') =
|
|||||||
select parseDateTimeInJodaSyntaxOrNull('2001 invalid 366 2000', 'yyyy D yyyy', 'UTC') IS NULL;
|
select parseDateTimeInJodaSyntaxOrNull('2001 invalid 366 2000', 'yyyy D yyyy', 'UTC') IS NULL;
|
||||||
|
|
||||||
-- Error handling
|
-- Error handling
|
||||||
select parseDateTimeInJodaSyntax('12 AM'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTimeInJodaSyntax(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
select parseDateTimeInJodaSyntax('12 AM', 'h a', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
select parseDateTimeInJodaSyntax('12 AM', 'h a', 'UTC', 'a fourth argument'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
|
-- The format string argument is optional
|
||||||
|
set session_timezone = 'UTC'; -- don't randomize the session timezone
|
||||||
|
select parseDateTimeInJodaSyntax('2021-01-04 23:12:34') = toDateTime('2021-01-04 23:12:34');
|
||||||
|
|
||||||
-- { echoOff }
|
-- { echoOff }
|
||||||
|
Loading…
Reference in New Issue
Block a user