diff --git a/dbms/include/DB/Functions/FunctionsConversion.h b/dbms/include/DB/Functions/FunctionsConversion.h index 447a5489105..2139fc71892 100644 --- a/dbms/include/DB/Functions/FunctionsConversion.h +++ b/dbms/include/DB/Functions/FunctionsConversion.h @@ -69,7 +69,7 @@ struct ConvertImpl static void execute(Block & block, const ColumnNumbers & arguments, size_t result) { typedef DataTypeDate::FieldType FromFieldType; - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); if (const ColumnVector * col_from = typeid_cast *>(&*block.getByPosition(arguments[0]).column)) { @@ -108,7 +108,7 @@ struct ConvertImpl static void execute(Block & block, const ColumnNumbers & arguments, size_t result) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); if (const ColumnVector * col_from = typeid_cast *>(&*block.getByPosition(arguments[0]).column)) { @@ -158,7 +158,7 @@ struct ConvertImpl32Or64ToDate static void execute(Block & block, const ColumnNumbers & arguments, size_t result) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); if (const ColumnVector * col_from = typeid_cast *>(&*block.getByPosition(arguments[0]).column)) @@ -248,7 +248,7 @@ namespace details { namespace { * объекту from_date_lut. Эта функция возвращает timestamp представлящий те же дату и время * в часовом поясе соответствующем объекту to_date_lut. */ -time_t convertTimestamp(time_t source_timestamp, DateLUTImpl & from_date_lut, DateLUTImpl & to_date_lut) +time_t convertTimestamp(time_t source_timestamp, const DateLUTImpl & from_date_lut, const DateLUTImpl & to_date_lut) { if (&from_date_lut == &to_date_lut) return source_timestamp; @@ -271,7 +271,7 @@ struct DateTimeToStringConverter static void vector_vector(const PODArray & vec_from, const ColumnString::Chars_t & data, const ColumnString::Offsets_t & offsets, ColumnString & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ColumnString::Chars_t & data_to = vec_to.getChars(); ColumnString::Offsets_t & offsets_to = vec_to.getOffsets(); @@ -287,7 +287,7 @@ struct DateTimeToStringConverter { ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); auto ti = convertTimestamp(vec_from[i], remote_date_lut, local_date_lut); formatImpl(ti, write_buffer); @@ -302,8 +302,8 @@ struct DateTimeToStringConverter static void vector_constant(const PODArray & vec_from, const std::string & data, ColumnString & vec_to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); ColumnString::Chars_t & data_to = vec_to.getChars(); ColumnString::Offsets_t & offsets_to = vec_to.getOffsets(); @@ -327,7 +327,7 @@ struct DateTimeToStringConverter const ColumnString::Offsets_t & offsets, ColumnString & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ColumnString::Chars_t & data_to = vec_to.getChars(); ColumnString::Offsets_t & offsets_to = vec_to.getOffsets(); @@ -343,7 +343,7 @@ struct DateTimeToStringConverter { ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); auto ti = convertTimestamp(from, remote_date_lut, local_date_lut); formatImpl(ti, write_buffer); @@ -357,8 +357,8 @@ struct DateTimeToStringConverter static void constant_constant(FromFieldType from, const std::string & data, std::string & to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); std::vector buf; WriteBufferFromVector > write_buffer(buf); @@ -533,7 +533,7 @@ struct StringToTimestampConverter static void vector_vector(const ColumnString::Chars_t & vec_from, const ColumnString::Chars_t & data, const ColumnString::Offsets_t & offsets, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ReadBuffer read_buffer(const_cast(reinterpret_cast(&vec_from[0])), vec_from.size(), 0); ColumnString::Offset_t prev_offset = 0; @@ -546,7 +546,7 @@ struct StringToTimestampConverter ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); auto ti = convertTimestamp(x, local_date_lut, remote_date_lut); @@ -562,8 +562,8 @@ struct StringToTimestampConverter static void vector_constant(const ColumnString::Chars_t & vec_from, const std::string & data, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); ReadBuffer read_buffer(const_cast(reinterpret_cast(&vec_from[0])), vec_from.size(), 0); char zero = 0; @@ -584,7 +584,7 @@ struct StringToTimestampConverter static void constant_vector(const std::string & from, const ColumnString::Chars_t & data, const ColumnString::Offsets_t & offsets, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ReadBufferFromString read_buffer(from); DataTypeDateTime::FieldType x = 0; @@ -596,7 +596,7 @@ struct StringToTimestampConverter { ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); auto ti = convertTimestamp(x, local_date_lut, remote_date_lut); @@ -607,8 +607,8 @@ struct StringToTimestampConverter static void constant_constant(const std::string & from, const std::string & data, ToFieldType & to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); ReadBufferFromString read_buffer(from); DataTypeDateTime::FieldType x = 0; diff --git a/dbms/include/DB/Functions/FunctionsDateTime.h b/dbms/include/DB/Functions/FunctionsDateTime.h index 8e104c6729d..52f7eae57a7 100644 --- a/dbms/include/DB/Functions/FunctionsDateTime.h +++ b/dbms/include/DB/Functions/FunctionsDateTime.h @@ -51,32 +51,32 @@ namespace DB struct ToYearImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(t); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(t); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(DayNum_t(d)); } }; struct ToMonthImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toMonth(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toMonth(DayNum_t(d)); } + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toMonth(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toMonth(DayNum_t(d)); } }; struct ToDayOfMonthImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfMonth(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfMonth(DayNum_t(d)); } + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfMonth(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfMonth(DayNum_t(d)); } }; struct ToDayOfWeekImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfWeek(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfWeek(DayNum_t(d)); } + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfWeek(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toDayOfWeek(DayNum_t(d)); } }; struct ToHourImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toHourInaccurate(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toHourInaccurate(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toHour", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -84,8 +84,8 @@ struct ToHourImpl struct ToMinuteImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toMinuteInaccurate(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toMinuteInaccurate(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -93,8 +93,8 @@ struct ToMinuteImpl struct ToSecondImpl { - static inline UInt8 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toSecondInaccurate(t); } - static inline UInt8 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt8 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toSecondInaccurate(t); } + static inline UInt8 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toSecond", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -102,33 +102,33 @@ struct ToSecondImpl struct ToMondayImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfWeek(remote_date_lut.toDayNum(t)); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfWeek(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfWeek(remote_date_lut.toDayNum(t)); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfWeek(DayNum_t(d)); } }; struct ToStartOfMonthImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfMonth(remote_date_lut.toDayNum(t)); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfMonth(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfMonth(remote_date_lut.toDayNum(t)); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfMonth(DayNum_t(d)); } }; struct ToStartOfQuarterImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfQuarter(remote_date_lut.toDayNum(t)); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfQuarter(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfQuarter(remote_date_lut.toDayNum(t)); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfQuarter(DayNum_t(d)); } }; struct ToStartOfYearImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfYear(remote_date_lut.toDayNum(t)); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfYear(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfYear(remote_date_lut.toDayNum(t)); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toFirstDayNumOfYear(DayNum_t(d)); } }; struct ToTimeImpl { /// При переводе во время, дату будем приравнивать к 1970-01-02. - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { time_t remote_t = remote_date_lut.toTimeInaccurate(t) + 86400; @@ -144,7 +144,7 @@ struct ToTimeImpl } } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toTime", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -152,8 +152,8 @@ struct ToTimeImpl struct ToStartOfMinuteImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfMinuteInaccurate(t); } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfMinuteInaccurate(t); } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toStartOfMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -161,8 +161,8 @@ struct ToStartOfMinuteImpl struct ToStartOfFiveMinuteImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfFiveMinuteInaccurate(t); } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfFiveMinuteInaccurate(t); } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toStartOfFiveMinute", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -170,8 +170,8 @@ struct ToStartOfFiveMinuteImpl struct ToStartOfHourImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfHourInaccurate(t); } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toStartOfHourInaccurate(t); } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toStartOfHour", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -179,33 +179,33 @@ struct ToStartOfHourImpl struct ToRelativeYearNumImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(t); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(t); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toYear(DayNum_t(d)); } }; struct ToRelativeMonthNumImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMonthNum(t); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMonthNum(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMonthNum(t); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMonthNum(DayNum_t(d)); } }; struct ToRelativeWeekNumImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeWeekNum(t); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeWeekNum(DayNum_t(d)); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeWeekNum(t); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeWeekNum(DayNum_t(d)); } }; struct ToRelativeDayNumImpl { - static inline UInt16 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toDayNum(t); } - static inline UInt16 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return static_cast(d); } + static inline UInt16 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toDayNum(t); } + static inline UInt16 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return static_cast(d); } }; struct ToRelativeHourNumImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeHourNum(t); } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeHourNum(t); } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toRelativeHourNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -213,8 +213,8 @@ struct ToRelativeHourNumImpl struct ToRelativeMinuteNumImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMinuteNum(t); } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return remote_date_lut.toRelativeMinuteNum(t); } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toRelativeMinuteNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -222,8 +222,8 @@ struct ToRelativeMinuteNumImpl struct ToRelativeSecondNumImpl { - static inline UInt32 execute(UInt32 t, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) { return t; } - static inline UInt32 execute(UInt16 d, DateLUTImpl & remote_date_lut, DateLUTImpl & local_date_lut) + static inline UInt32 execute(UInt32 t, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { return t; } + static inline UInt32 execute(UInt16 d, const DateLUTImpl & remote_date_lut, const DateLUTImpl & local_date_lut) { throw Exception("Illegal type Date of argument for function toRelativeSecondNum", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } @@ -235,14 +235,14 @@ struct Transformer static void vector_vector(const PODArray & vec_from, const ColumnString::Chars_t & data, const ColumnString::Offsets_t & offsets, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ColumnString::Offset_t prev_offset = 0; for (size_t i = 0; i < vec_from.size(); ++i) { ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); vec_to[i] = Transform::execute(vec_from[i], remote_date_lut, local_date_lut); prev_offset = cur_offset; } @@ -251,8 +251,8 @@ struct Transformer static void vector_constant(const PODArray & vec_from, const std::string & data, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); for (size_t i = 0; i < vec_from.size(); ++i) vec_to[i] = Transform::execute(vec_from[i], remote_date_lut, local_date_lut); } @@ -260,14 +260,14 @@ struct Transformer static void constant_vector(const FromType & from, const ColumnString::Chars_t & data, const ColumnString::Offsets_t & offsets, PODArray & vec_to) { - auto & local_date_lut = DateLUT::instance(); + const auto & local_date_lut = DateLUT::instance(); ColumnString::Offset_t prev_offset = 0; for (size_t i = 0; i < offsets.size(); ++i) { ColumnString::Offset_t cur_offset = offsets[i]; const std::string time_zone(reinterpret_cast(&data[prev_offset]), cur_offset - prev_offset - 1); - auto & remote_date_lut = DateLUT::instance(time_zone); + const auto & remote_date_lut = DateLUT::instance(time_zone); vec_to[i] = Transform::execute(from, remote_date_lut, local_date_lut); prev_offset = cur_offset; } @@ -275,8 +275,8 @@ struct Transformer static void constant_constant(const FromType & from, const std::string & data, ToType & to) { - auto & local_date_lut = DateLUT::instance(); - auto & remote_date_lut = DateLUT::instance(data); + const auto & local_date_lut = DateLUT::instance(); + const auto & remote_date_lut = DateLUT::instance(data); to = Transform::execute(from, remote_date_lut, local_date_lut); } }; diff --git a/dbms/include/DB/IO/WriteHelpers.h b/dbms/include/DB/IO/WriteHelpers.h index aeb7573fe4b..dd32b33612a 100644 --- a/dbms/include/DB/IO/WriteHelpers.h +++ b/dbms/include/DB/IO/WriteHelpers.h @@ -375,7 +375,7 @@ inline void writeDateTimeText(time_t datetime, WriteBuffer & buf) return; } - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); const auto & values = date_lut.getValues(datetime); s[0] += values.year / 1000; diff --git a/dbms/src/Interpreters/QueryLog.cpp b/dbms/src/Interpreters/QueryLog.cpp index 77865140134..34eab22795b 100644 --- a/dbms/src/Interpreters/QueryLog.cpp +++ b/dbms/src/Interpreters/QueryLog.cpp @@ -210,7 +210,7 @@ void QueryLog::flush() { LOG_TRACE(log, "Flushing query log"); - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); Block block = createBlock(); diff --git a/dbms/src/Server/OLAPQueryParser.cpp b/dbms/src/Server/OLAPQueryParser.cpp index a577e4d4815..4f356cf5703 100644 --- a/dbms/src/Server/OLAPQueryParser.cpp +++ b/dbms/src/Server/OLAPQueryParser.cpp @@ -95,7 +95,7 @@ QueryParseResult QueryParser::parse(std::istream & s) if (result.date_first > result.date_last) throw Exception("First date is bigger than last date.", ErrorCodes::FIRST_DATE_IS_BIGGER_THAN_LAST_DATE); - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); result.days = 1 + date_lut.toDayNum(result.date_last) - date_lut.toDayNum(result.date_first); result.cut_date_last = false; diff --git a/dbms/src/Storages/MergeTree/ActiveDataPartSet.cpp b/dbms/src/Storages/MergeTree/ActiveDataPartSet.cpp index 90a73932b2c..cadd0778888 100644 --- a/dbms/src/Storages/MergeTree/ActiveDataPartSet.cpp +++ b/dbms/src/Storages/MergeTree/ActiveDataPartSet.cpp @@ -105,7 +105,7 @@ size_t ActiveDataPartSet::size() const String ActiveDataPartSet::getPartName(DayNum_t left_date, DayNum_t right_date, UInt64 left_id, UInt64 right_id, UInt64 level) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); /// Имя директории для куска иммет вид: YYYYMMDD_YYYYMMDD_N_N_L. String res; @@ -153,7 +153,7 @@ void ActiveDataPartSet::parsePartName(const String & file_name, Part & part, con const Poco::RegularExpression::MatchVec & matches = *matches_p; - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); part.left_date = date_lut.YYYYMMDDToDayNum(parse(file_name.substr(matches[1].offset, matches[1].length))); part.right_date = date_lut.YYYYMMDDToDayNum(parse(file_name.substr(matches[2].offset, matches[2].length))); diff --git a/dbms/src/Storages/MergeTree/MergeTreeDataMerger.cpp b/dbms/src/Storages/MergeTree/MergeTreeDataMerger.cpp index f94a3496d6e..6d47840c076 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeDataMerger.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeDataMerger.cpp @@ -46,7 +46,7 @@ bool MergeTreeDataMerger::selectPartsToMerge(MergeTreeData::DataPartsVector & pa { MergeTreeData::DataParts data_parts = data.getDataParts(); - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); size_t min_max = -1U; size_t min_min = -1U; diff --git a/dbms/src/Storages/MergeTree/MergeTreeDataWriter.cpp b/dbms/src/Storages/MergeTree/MergeTreeDataWriter.cpp index 30468cc1228..11a7fa0cb5a 100644 --- a/dbms/src/Storages/MergeTree/MergeTreeDataWriter.cpp +++ b/dbms/src/Storages/MergeTree/MergeTreeDataWriter.cpp @@ -12,7 +12,7 @@ BlocksWithDateIntervals MergeTreeDataWriter::splitBlockIntoParts(const Block & b { data.check(block, true); - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); size_t rows = block.rows(); size_t columns = block.columns(); @@ -77,7 +77,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataWriter::writeTempPart(BlockWithDa UInt16 min_date = block_with_dates.min_date; UInt16 max_date = block_with_dates.max_date; - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); size_t part_size = (block.rows() + data.index_granularity - 1) / data.index_granularity; diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 2ca46790a49..cbf94b6c2b5 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -2214,7 +2214,7 @@ void StorageReplicatedMergeTree::alter(const AlterCommands & params, static String getFakePartNameForDrop(const String & month_name, UInt64 left, UInt64 right) { /// Диапазон дат - весь месяц. - auto & lut = DateLUT::instance(); + const auto & lut = DateLUT::instance(); time_t start_time = lut.YYYYMMDDToDate(parse(month_name + "01")); DayNum_t left_date = lut.toDayNum(start_time); DayNum_t right_date = DayNum_t(static_cast(left_date) + lut.daysInMonth(start_time) - 1); diff --git a/libs/libcommon/src/DateLUT.cpp b/libs/libcommon/src/DateLUT.cpp index f9596b47fdb..8f14297ee2a 100644 --- a/libs/libcommon/src/DateLUT.cpp +++ b/libs/libcommon/src/DateLUT.cpp @@ -1,11 +1,8 @@ #include -#include #include #include -std::string DateLUT::default_time_zone; - DateLUT::DateLUT() { using namespace icu; @@ -16,6 +13,7 @@ DateLUT::DateLUT() UnicodeString u_out; tz->getID(u_out); + std::string default_time_zone; u_out.toUTF8String(default_time_zone); std::unique_ptr time_zone_ids(TimeZone::createEnumeration()); @@ -79,37 +77,35 @@ DateLUT::DateLUT() throw Poco::Exception("Could not find any time zone information."); date_lut_impl_list = std::make_unique(group_id); -} -DateLUTImpl & DateLUT::instance(const std::string & time_zone) -{ - auto & date_lut = Singleton::instance(); - return date_lut.get(time_zone); -} - -DateLUTImpl & DateLUT::get(const std::string & time_zone) -{ - const std::string & actual_time_zone = time_zone.empty() ? default_time_zone : time_zone; - - auto it = time_zone_to_group.find(actual_time_zone); + /// Инициализация указателя на реализацию для часового пояса по умолчанию. + auto it = time_zone_to_group.find(default_time_zone); if (it == time_zone_to_group.end()) - throw Poco::Exception("Invalid time zone " + actual_time_zone); + throw Poco::Exception("Failed to get default time zone information."); + default_group_id = it->second; - const auto & group_id = it->second; - auto & wrapper = (*date_lut_impl_list)[group_id]; + default_date_lut_impl = new DateLUTImpl(default_time_zone); + auto & wrapper = (*date_lut_impl_list)[default_group_id]; + wrapper.store(default_date_lut_impl, std::memory_order_seq_cst); +} + +const DateLUTImpl & DateLUT::getImplementation(const std::string & time_zone, size_t group_id) const +{ + static auto & date_lut_table = *date_lut_impl_list; + + auto & wrapper = date_lut_table[group_id]; DateLUTImpl * tmp = wrapper.load(std::memory_order_acquire); if (tmp == nullptr) { std::lock_guard guard(mutex); - tmp = wrapper.load(std::memory_order_acquire); + tmp = wrapper.load(std::memory_order_relaxed); if (tmp == nullptr) { - tmp = new DateLUTImpl(actual_time_zone); + tmp = new DateLUTImpl(time_zone); wrapper.store(tmp, std::memory_order_release); } } return *tmp; } - diff --git a/libs/libcommon/src/tests/date_lut2.cpp b/libs/libcommon/src/tests/date_lut2.cpp index 6738e66a8d6..6c889bc84b9 100644 --- a/libs/libcommon/src/tests/date_lut2.cpp +++ b/libs/libcommon/src/tests/date_lut2.cpp @@ -33,7 +33,7 @@ static time_t orderedIdentifierToDate(unsigned value) void loop(time_t begin, time_t end, int step) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); for (time_t t = begin; t < end; t += step) std::cout << toString(t) diff --git a/libs/libcommon/src/tests/date_lut3.cpp b/libs/libcommon/src/tests/date_lut3.cpp index 185e8ee5f5f..df4ea9dc6b1 100644 --- a/libs/libcommon/src/tests/date_lut3.cpp +++ b/libs/libcommon/src/tests/date_lut3.cpp @@ -35,7 +35,7 @@ static time_t orderedIdentifierToDate(unsigned value) void loop(time_t begin, time_t end, int step) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); for (time_t t = begin; t < end; t += step) { diff --git a/libs/libcommon/src/tests/date_lut4.cpp b/libs/libcommon/src/tests/date_lut4.cpp index b009aaad4b5..69a15c1f25e 100644 --- a/libs/libcommon/src/tests/date_lut4.cpp +++ b/libs/libcommon/src/tests/date_lut4.cpp @@ -7,7 +7,7 @@ int main(int argc, char ** argv) /** В DateLUT был глюк - для времён из дня 1970-01-01, возвращался номер часа больше 23. */ static const time_t TIME = 66130; - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); std::cerr << date_lut.toHourInaccurate(TIME) << std::endl; std::cerr << date_lut.toDayNum(TIME) << std::endl; diff --git a/libs/libmysqlxx/include/mysqlxx/Date.h b/libs/libmysqlxx/include/mysqlxx/Date.h index a23942d2c44..03ecec0f619 100644 --- a/libs/libmysqlxx/include/mysqlxx/Date.h +++ b/libs/libmysqlxx/include/mysqlxx/Date.h @@ -29,7 +29,7 @@ private: void init(time_t time) { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); const auto & values = date_lut.getValues(time); m_year = values.year; diff --git a/libs/libmysqlxx/include/mysqlxx/DateTime.h b/libs/libmysqlxx/include/mysqlxx/DateTime.h index 9581dcd8694..c4bebb95e17 100644 --- a/libs/libmysqlxx/include/mysqlxx/DateTime.h +++ b/libs/libmysqlxx/include/mysqlxx/DateTime.h @@ -43,7 +43,7 @@ private: return; } - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); const auto & values = date_lut.getValues(time); m_year = values.year; diff --git a/libs/libmysqlxx/include/mysqlxx/Value.h b/libs/libmysqlxx/include/mysqlxx/Value.h index d4cb52b7cb8..e6e4988d9ef 100644 --- a/libs/libmysqlxx/include/mysqlxx/Value.h +++ b/libs/libmysqlxx/include/mysqlxx/Value.h @@ -145,7 +145,7 @@ private: time_t getDateTimeImpl() const { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); if (m_length == 10) { @@ -173,7 +173,7 @@ private: time_t getDateImpl() const { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); if (m_length == 10 || m_length == 19) { @@ -216,7 +216,7 @@ private: return getDateImpl(); else { - auto & date_lut = DateLUT::instance(); + const auto & date_lut = DateLUT::instance(); return date_lut.toDate(getIntImpl()); } }