This is an automated email from the ASF dual-hosted git repository.
zclll pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 69f82ad67db [Feature](variable) Support session variable lc_time_names
(#56915)
69f82ad67db is described below
commit 69f82ad67db41dc908ca0aae9059ff59d8437160
Author: linrrarity <[email protected]>
AuthorDate: Wed Oct 22 12:38:52 2025 +0800
[Feature](variable) Support session variable lc_time_names (#56915)
### What problem does this PR solve?
Issue Number: #48203
Related PR: #xxx
Problem Summary:
### Release note
Support session variable `lc_time_name`
The supported locale are consistent with
[MySQL](https://dev.mysql.com/doc/refman/8.4/en/locale-support.html).
```text
mysql> SELECT DAYNAME('2025-10-15');
+-----------------------+
| DAYNAME('2025-10-15') |
+-----------------------+
| Wednesday |
+-----------------------+
1 row in set (0.02 sec)
mysql> SELECT MONTHNAME('2025-10-15');
+-------------------------+
| MONTHNAME('2025-10-15') |
+-------------------------+
| October |
+-------------------------+
1 row in set (0.01 sec)
mysql> SET lc_time_names='zh_CN';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT DAYNAME('2025-10-15');
+-----------------------+
| DAYNAME('2025-10-15') |
+-----------------------+
| 星期三 |
+-----------------------+
1 row in set (0.01 sec)
mysql> SELECT MONTHNAME('2025-10-15');
+-------------------------+
| MONTHNAME('2025-10-15') |
+-------------------------+
| 十月 |
+-------------------------+
1 row in set (0.02 sec)
```
---
be/src/runtime/runtime_state.cpp | 1 +
be/src/runtime/runtime_state.h | 2 +
be/src/vec/functions/date_time_transforms.h | 15 +-
.../function_date_or_datetime_to_string.cpp | 78 +++-
be/src/vec/runtime/vdatetime_value.cpp | 34 ++
be/src/vec/runtime/vdatetime_value.h | 4 +
.../executable/DateTimeExtractAndTransform.java | 28 +-
.../main/java/org/apache/doris/qe/Coordinator.java | 1 +
.../org/apache/doris/qe/CoordinatorContext.java | 1 +
.../java/org/apache/doris/qe/SessionVariable.java | 54 +++
gensrc/thrift/PaloInternalService.thrift | 3 +
.../sql-functions/doc_date_functions_test.out | 351 ++++++++++++++++
.../sql-functions/doc_date_functions_test.groovy | 454 +++++++++++++++++++++
13 files changed, 1013 insertions(+), 13 deletions(-)
diff --git a/be/src/runtime/runtime_state.cpp b/be/src/runtime/runtime_state.cpp
index 8258443c3f6..33db0f60e7c 100644
--- a/be/src/runtime/runtime_state.cpp
+++ b/be/src/runtime/runtime_state.cpp
@@ -214,6 +214,7 @@ Status RuntimeState::init(const TUniqueId&
fragment_instance_id, const TQueryOpt
const TQueryGlobals& query_globals, ExecEnv*
exec_env) {
_fragment_instance_id = fragment_instance_id;
_query_options = query_options;
+ _lc_time_names = query_globals.lc_time_names;
if (query_globals.__isset.time_zone && query_globals.__isset.nano_seconds)
{
_timezone = query_globals.time_zone;
_timestamp_ms = query_globals.timestamp_ms;
diff --git a/be/src/runtime/runtime_state.h b/be/src/runtime/runtime_state.h
index c2183c6dd59..3d89f4aa0d4 100644
--- a/be/src/runtime/runtime_state.h
+++ b/be/src/runtime/runtime_state.h
@@ -163,6 +163,7 @@ public:
// if possible, use timezone_obj() rather than timezone()
const std::string& timezone() const { return _timezone; }
const cctz::time_zone& timezone_obj() const { return _timezone_obj; }
+ const std::string& lc_time_names() const { return _lc_time_names; }
const std::string& user() const { return _user; }
const TUniqueId& query_id() const { return _query_id; }
const TUniqueId& fragment_instance_id() const { return
_fragment_instance_id; }
@@ -747,6 +748,7 @@ private:
int32_t _nano_seconds;
std::string _timezone;
cctz::time_zone _timezone_obj;
+ std::string _lc_time_names;
TUniqueId _query_id;
// fragment id for each TPipelineFragmentParams
diff --git a/be/src/vec/functions/date_time_transforms.h
b/be/src/vec/functions/date_time_transforms.h
index 55b426812c6..89dffe288cf 100644
--- a/be/src/vec/functions/date_time_transforms.h
+++ b/be/src/vec/functions/date_time_transforms.h
@@ -163,8 +163,10 @@ struct DayNameImpl {
static constexpr auto max_size = MAX_DAY_NAME_LEN;
static auto execute(const typename PrimitiveTypeTraits<PType>::CppType& dt,
- ColumnString::Chars& res_data, size_t& offset) {
- const auto* day_name = dt.day_name();
+ ColumnString::Chars& res_data, size_t& offset,
+ const char* const* day_names) {
+ DCHECK(day_names != nullptr);
+ const auto* day_name = dt.day_name_with_locale(day_names);
if (day_name != nullptr) {
auto len = strlen(day_name);
memcpy(&res_data[offset], day_name, len);
@@ -186,7 +188,8 @@ struct ToIso8601Impl {
static constexpr auto max_size = std::is_same_v<ArgType, UInt32> ? 10 : 26;
static auto execute(const typename PrimitiveTypeTraits<PType>::CppType& dt,
- ColumnString::Chars& res_data, size_t& offset) {
+ ColumnString::Chars& res_data, size_t& offset,
+ const char* const* /*names_ptr*/) {
auto length = dt.to_buffer((char*)res_data.data() + offset,
std::is_same_v<ArgType, UInt32> ? -1 : 6);
if (std::is_same_v<ArgType, UInt64>) {
@@ -210,8 +213,10 @@ struct MonthNameImpl {
static constexpr auto max_size = MAX_MONTH_NAME_LEN;
static auto execute(const typename PrimitiveTypeTraits<PType>::CppType& dt,
- ColumnString::Chars& res_data, size_t& offset) {
- const auto* month_name = dt.month_name();
+ ColumnString::Chars& res_data, size_t& offset,
+ const char* const* month_names) {
+ DCHECK(month_names != nullptr);
+ const auto* month_name = dt.month_name_with_locale(month_names);
if (month_name != nullptr) {
auto len = strlen(month_name);
memcpy(&res_data[offset], month_name, len);
diff --git a/be/src/vec/functions/function_date_or_datetime_to_string.cpp
b/be/src/vec/functions/function_date_or_datetime_to_string.cpp
index f8177bb69a5..4d1bbff58f9 100644
--- a/be/src/vec/functions/function_date_or_datetime_to_string.cpp
+++ b/be/src/vec/functions/function_date_or_datetime_to_string.cpp
@@ -18,6 +18,10 @@
//
https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionDateOrDatetimeToString.cpp
// and modified by Doris
+#include <unicode/dtfmtsym.h>
+#include <unicode/locid.h>
+#include <unicode/unistr.h>
+
#include <cstddef>
#include <memory>
#include <utility>
@@ -75,6 +79,67 @@ public:
ColumnNumbers get_arguments_that_are_always_constant() const override {
return {1}; }
+ // In ICU, Week_array: {"", "Sunday", "Monday", ..., "Saturday"}, size = 8
+ // Month_array: {"January", "February", ..., "December"}, size = 12
+ static constexpr size_t DAY_NUM_IN_ICU = 8;
+ static constexpr size_t MONTH_NUM_IN_ICU = 12;
+ // day_names: {"Monday", ..., "Sunday"}
+ // month_names: {"", "January", ..., "December"}
+ struct LocaleDayMonthNameState {
+ std::string locale_name;
+ std::vector<std::string> day_name_storage {7};
+ std::vector<std::string> month_name_storage {13};
+ const char* day_names[7];
+ const char* month_names[13];
+ };
+
+ Status open(FunctionContext* context, FunctionContext::FunctionStateScope
scope) override {
+ if (scope == FunctionContext::THREAD_LOCAL) {
+ return Status::OK();
+ }
+
+ auto state = std::make_shared<LocaleDayMonthNameState>();
+ state->locale_name = context->state()->lc_time_names();
+#ifdef BE_TEST
+ state->locale_name = "en_US";
+#endif
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Locale locale(state->locale_name.c_str());
+ icu::DateFormatSymbols symbols(locale, status);
+ if (U_FAILURE(status)) [[unlikely]] {
+ return Status::FatalError("Failed to create ICU DateFormatSymbols
for locale {}",
+ state->locale_name);
+ }
+
+ int32_t day_count, month_count;
+ const icu::UnicodeString* days = symbols.getWeekdays(day_count);
+ const icu::UnicodeString* months = symbols.getMonths(month_count);
+ if (month_count != MONTH_NUM_IN_ICU || day_count != DAY_NUM_IN_ICU)
[[unlikely]] {
+ return Status::FatalError(
+ "Wrong number of month or day names for locale {}: got {}
months and {} days",
+ state->locale_name, month_count, day_count - 1);
+ }
+ for (int i = 0; i < MONTH_NUM_IN_ICU; ++i) {
+ months[i].toUTF8String(state->month_name_storage[i + 1]);
+ state->month_names[i + 1] = state->month_name_storage[i +
1].c_str();
+ }
+
+ // In ICU, the first array is always like {"", "Sunday", "Monday",
..., "Saturday"}
+ // so here skip the first empty string and adjust the order of day
names into {"Monday", ..., "Sunday"}
+ for (int i = 1; i < DAY_NUM_IN_ICU; ++i) {
+ if (i == 1) {
+ days[i].toUTF8String(state->day_name_storage[6]);
+ state->day_names[6] = state->day_name_storage[6].c_str();
+ } else {
+ days[i].toUTF8String(state->day_name_storage[i - 2]);
+ state->day_names[i - 2] = state->day_name_storage[i -
2].c_str();
+ }
+ }
+
+ context->set_function_state(scope, state);
+ return IFunction::open(context, scope);
+ }
+
Status execute_impl(FunctionContext* context, Block& block, const
ColumnNumbers& arguments,
uint32_t result, size_t input_rows_count) const
override {
const ColumnPtr source_col =
block.get_by_position(arguments[0]).column;
@@ -102,11 +167,20 @@ private:
res_offsets.resize(len);
size_t offset = 0;
+ auto* state = reinterpret_cast<LocaleDayMonthNameState*>(
+ context->get_function_state(FunctionContext::FRAGMENT_LOCAL));
+ const char* const* names_ptr = nullptr;
+ if constexpr (std::is_same_v<Transform,
DayNameImpl<Transform::OpArgType>>) {
+ names_ptr = state->day_names;
+ } else if constexpr (std::is_same_v<Transform,
MonthNameImpl<Transform::OpArgType>>) {
+ names_ptr = state->month_names;
+ }
+
for (int i = 0; i < len; ++i) {
const auto& t = ts[i];
const auto date_time_value = binary_cast<NativeType, DateType>(t);
- res_offsets[i] =
- cast_set<UInt32>(Transform::execute(date_time_value,
res_data, offset));
+ res_offsets[i] = cast_set<UInt32>(
+ Transform::execute(date_time_value, res_data, offset,
names_ptr));
DCHECK(date_time_value.is_valid_date());
}
res_data.resize(res_offsets[res_offsets.size() - 1]);
diff --git a/be/src/vec/runtime/vdatetime_value.cpp
b/be/src/vec/runtime/vdatetime_value.cpp
index e580896f54f..3b77981e3ea 100644
--- a/be/src/vec/runtime/vdatetime_value.cpp
+++ b/be/src/vec/runtime/vdatetime_value.cpp
@@ -20,6 +20,8 @@
#include <cctz/civil_time.h>
#include <cctz/time_zone.h>
#include <glog/logging.h>
+#include <unicode/dtfmtsym.h>
+#include <unicode/locid.h>
#include <cctype>
#include <cstddef>
@@ -1618,6 +1620,13 @@ const char* VecDateTimeValue::month_name() const {
return s_month_name[_month];
}
+const char* VecDateTimeValue::month_name_with_locale(const char* const*
month_names) const {
+ if (_month < 1 || _month > 12) {
+ return nullptr;
+ }
+ return month_names[_month];
+}
+
const char* VecDateTimeValue::day_name() const {
int day = weekday();
if (day < 0 || day >= 7) {
@@ -1626,6 +1635,14 @@ const char* VecDateTimeValue::day_name() const {
return s_day_name[day];
}
+const char* VecDateTimeValue::day_name_with_locale(const char* const*
day_names) const {
+ int day = weekday();
+ if (day < 0 || day >= 7) {
+ return nullptr;
+ }
+ return day_names[day];
+}
+
VecDateTimeValue VecDateTimeValue::local_time() {
VecDateTimeValue value;
value.from_unixtime(time(nullptr), TimezoneUtils::default_time_zone);
@@ -2906,6 +2923,23 @@ const char* DateV2Value<T>::day_name() const {
return s_day_name[day];
}
+template <typename T>
+const char* DateV2Value<T>::month_name_with_locale(const char* const*
month_names) const {
+ if (date_v2_value_.month_ < 1 || date_v2_value_.month_ > 12) {
+ return nullptr;
+ }
+ return month_names[date_v2_value_.month_];
+}
+
+template <typename T>
+const char* DateV2Value<T>::day_name_with_locale(const char* const* day_names)
const {
+ int day = weekday();
+ if (day < 0 || day >= 7) {
+ return nullptr;
+ }
+ return day_names[day];
+}
+
template <typename T>
void DateV2Value<T>::unchecked_set_time(uint16_t year, uint8_t month, uint8_t
day, uint8_t hour,
uint8_t minute, uint16_t second,
uint32_t microsecond) {
diff --git a/be/src/vec/runtime/vdatetime_value.h
b/be/src/vec/runtime/vdatetime_value.h
index 7140c0845ed..ffb5da58408 100644
--- a/be/src/vec/runtime/vdatetime_value.h
+++ b/be/src/vec/runtime/vdatetime_value.h
@@ -647,8 +647,10 @@ public:
bool operator>(const DateV2Value<T>& other) const;
const char* month_name() const;
+ const char* month_name_with_locale(const char* const* month_names) const;
const char* day_name() const;
+ const char* day_name_with_locale(const char* const* day_names) const;
VecDateTimeValue& operator+=(int64_t count) {
bool is_neg = false;
@@ -1175,8 +1177,10 @@ public:
DateV2Value<T>& operator=(const DateV2Value<T>& other) = default;
const char* month_name() const;
+ const char* month_name_with_locale(const char* const* month_names) const;
const char* day_name() const;
+ const char* day_name_with_locale(const char* const* day_names) const;
DateV2Value<T>& operator+=(int64_t count) {
bool is_neg = false;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
index 087fa867948..204ec49f638 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/executable/DateTimeExtractAndTransform.java
@@ -46,6 +46,7 @@ import org.apache.doris.nereids.types.DateV2Type;
import org.apache.doris.nereids.types.DecimalV3Type;
import org.apache.doris.nereids.types.StringType;
import org.apache.doris.nereids.util.DateUtils;
+import org.apache.doris.qe.ConnectContext;
import org.apache.commons.lang3.StringUtils;
@@ -1025,40 +1026,55 @@ public class DateTimeExtractAndTransform {
return new TinyIntLiteral((byte)
date.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()));
}
+ /**
+ * Get locale from session variable lc_time_names, fallback to default if
not available
+ */
+ private static Locale getSessionLocale() {
+ ConnectContext ctx = ConnectContext.get();
+ if (ctx != null && ctx.getSessionVariable() != null) {
+ String lcTimeNames = ctx.getSessionVariable().getLcTimeNames();
+ if (lcTimeNames != null && !lcTimeNames.isEmpty()) {
+ String[] parts = lcTimeNames.split("_");
+ return new Locale(parts[0], parts[1]);
+ }
+ }
+ return Locale.getDefault();
+ }
+
@ExecFunction(name = "dayname")
public static Expression dayName(DateTimeV2Literal dateTime) {
return new
VarcharLiteral(dateTime.toJavaDateType().getDayOfWeek().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "dayname")
public static Expression dayName(DateTimeLiteral dateTime) {
return new
VarcharLiteral(dateTime.toJavaDateType().getDayOfWeek().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "dayname")
public static Expression dayName(DateV2Literal date) {
return new
VarcharLiteral(date.toJavaDateType().getDayOfWeek().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "monthname")
public static Expression monthName(DateTimeV2Literal dateTime) {
return new
VarcharLiteral(dateTime.toJavaDateType().getMonth().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "monthname")
public static Expression monthName(DateTimeLiteral dateTime) {
return new
VarcharLiteral(dateTime.toJavaDateType().getMonth().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "monthname")
public static Expression monthName(DateV2Literal date) {
return new
VarcharLiteral(date.toJavaDateType().getMonth().getDisplayName(TextStyle.FULL,
- Locale.getDefault()));
+ getSessionLocale()));
}
@ExecFunction(name = "from_second")
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
index 27f2348f59c..9d44f15384e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
@@ -358,6 +358,7 @@ public class Coordinator implements CoordInterface {
} else {
this.queryGlobals.setTimeZone(context.getSessionVariable().getTimeZone());
}
+
this.queryGlobals.setLcTimeNames(context.getSessionVariable().getLcTimeNames());
this.assignedRuntimeFilters = planner.getRuntimeFilters();
this.topnFilters = planner.getTopnFilters();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/qe/CoordinatorContext.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/CoordinatorContext.java
index 0fbcb5690fb..c03253341fc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/CoordinatorContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/CoordinatorContext.java
@@ -351,6 +351,7 @@ public class CoordinatorContext {
} else {
queryGlobals.setTimeZone(context.getSessionVariable().getTimeZone());
}
+
queryGlobals.setLcTimeNames(context.getSessionVariable().getLcTimeNames());
return queryGlobals;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 03e1832c8c9..5611968ee70 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -131,6 +131,29 @@ public class SessionVariable implements Serializable,
Writable {
public static final String NET_WRITE_TIMEOUT = "net_write_timeout";
public static final String NET_READ_TIMEOUT = "net_read_timeout";
public static final String TIME_ZONE = "time_zone";
+ public static final String LC_TIME_NAMES = "lc_time_names";
+ private static final ImmutableSet<String> SUPPORTED_LC_TIME_NAMES =
ImmutableSet.of(
+ "ar_AE", "ar_BH", "ar_JO", "ar_SA", "ar_SY", "be_BY",
+ "bg_BG", "ca_ES", "cs_CZ", "da_DK", "de_AT", "de_DE",
+ "en_US", "es_ES", "et_EE", "eu_ES", "fi_FI", "fo_FO",
+ "fr_FR", "gl_ES", "gu_IN", "he_IL", "hi_IN", "hr_HR",
+ "hu_HU", "id_ID", "is_IS", "it_CH", "ja_JP", "ko_KR",
+ "lt_LT", "lv_LV", "mk_MK", "mn_MN", "ms_MY", "nb_NO",
+ "nl_NL", "pl_PL", "pt_BR", "pt_PT", "ro_RO", "ru_RU",
+ "ru_UA", "sk_SK", "sl_SI", "sq_AL", "sr_RS", "sv_SE",
+ "ta_IN", "te_IN", "th_TH", "tr_TR", "uk_UA", "ur_PK",
+ "vi_VN", "zh_CN", "zh_TW", "ar_DZ", "ar_EG", "ar_IN",
+ "ar_IQ", "ar_KW", "ar_LB", "ar_LY", "ar_MA", "ar_OM",
+ "ar_QA", "ar_SD", "ar_TN", "ar_YE", "de_BE", "de_CH",
+ "de_LU", "en_AU", "en_CA", "en_GB", "en_IN", "en_NZ",
+ "en_PH", "en_ZA", "en_ZW", "es_AR", "es_BO", "es_CL",
+ "es_CO", "es_CR", "es_DO", "es_EC", "es_GT", "es_HN",
+ "es_MX", "es_NI", "es_PA", "es_PE", "es_PR", "es_PY",
+ "es_SV", "es_US", "es_UY", "es_VE", "fr_BE", "fr_CA",
+ "fr_CH", "fr_LU", "it_IT", "nl_BE", "no_NO", "sv_FI",
+ "zh_HK", "el_GR", "rm_CH"
+ );
+
public static final String SQL_SAFE_UPDATES = "sql_safe_updates";
public static final String NET_BUFFER_LENGTH = "net_buffer_length";
public static final String HAVE_QUERY_CACHE = "have_query_cache";
@@ -1129,6 +1152,10 @@ public class SessionVariable implements Serializable,
Writable {
@VariableMgr.VarAttr(name = TIME_ZONE, needForward = true,
affectQueryResult = true)
public String timeZone = TimeUtils.getSystemTimeZone().getID();
+ @VariableMgr.VarAttr(name = LC_TIME_NAMES, needForward = true,
affectQueryResult = true,
+ setter = "setLcTimeNames")
+ public String lcTimeNames = "en_US";
+
@VariableMgr.VarAttr(name = PARALLEL_EXCHANGE_INSTANCE_NUM)
public int exchangeInstanceParallel = 100;
@@ -3510,6 +3537,33 @@ public class SessionVariable implements Serializable,
Writable {
this.timeZone = timeZone;
}
+ private static String standarlizeLcTimeNames(String value) {
+ if (value.isEmpty()) {
+ throw new InvalidParameterException("lc_time_names value is
empty");
+ }
+ String[] segments = value.split("_");
+ if (segments.length != 2) {
+ throw new InvalidParameterException(
+ "lc_time_names value must be in language_COUNTRY form: " +
value);
+ }
+
+ return segments[0].toLowerCase() + "_" + segments[1].toUpperCase();
+ }
+
+ public void setLcTimeNames(String lcTimeNames) {
+ String standardLcTimeNames = standarlizeLcTimeNames(lcTimeNames);
+ if (!SUPPORTED_LC_TIME_NAMES.contains(standardLcTimeNames)) {
+ String supportedList = String.join(", ", SUPPORTED_LC_TIME_NAMES);
+ throw new InvalidParameterException("Unsupported lc_time_names
value: " + lcTimeNames
+ + ". Supported values are: " + supportedList);
+ }
+ this.lcTimeNames = standardLcTimeNames;
+ }
+
+ public String getLcTimeNames() {
+ return lcTimeNames;
+ }
+
public int getSqlSafeUpdates() {
return sqlSafeUpdates;
}
diff --git a/gensrc/thrift/PaloInternalService.thrift
b/gensrc/thrift/PaloInternalService.thrift
index f781af22bf1..415e1b40d95 100644
--- a/gensrc/thrift/PaloInternalService.thrift
+++ b/gensrc/thrift/PaloInternalService.thrift
@@ -489,6 +489,9 @@ struct TQueryGlobals {
4: optional bool load_zero_tolerance = false
5: optional i32 nano_seconds
+
+ // Locale name used for month/day names formatting, e.g. en_US
+ 6: optional string lc_time_names
}
diff --git
a/regression-test/data/doc/sql-manual/sql-functions/doc_date_functions_test.out
b/regression-test/data/doc/sql-manual/sql-functions/doc_date_functions_test.out
index 7807b4c5e2b..bc33c290641 100644
---
a/regression-test/data/doc/sql-manual/sql-functions/doc_date_functions_test.out
+++
b/regression-test/data/doc/sql-manual/sql-functions/doc_date_functions_test.out
@@ -227,6 +227,138 @@ Sunday
-- !dayname_3 --
\N
+-- !dayname_zh_cn --
+星期日
+
+-- !dayname_zh_tw --
+星期五
+
+-- !dayname_zh_hk --
+星期日
+
+-- !dayname_fr_fr --
+vendredi
+
+-- !dayname_fr_be --
+lundi
+
+-- !dayname_fr_ca --
+samedi
+
+-- !dayname_de_de --
+Donnerstag
+
+-- !dayname_de_at --
+Samstag
+
+-- !dayname_de_ch --
+Samstag
+
+-- !dayname_ja_jp --
+土曜日
+
+-- !dayname_ko_kr --
+일요일
+
+-- !dayname_es_es --
+domingo
+
+-- !dayname_es_mx --
+domingo
+
+-- !dayname_es_ar --
+miércoles
+
+-- !dayname_ru_ru --
+четверг
+
+-- !dayname_ru_ua --
+вторник
+
+-- !dayname_it_it --
+sabato
+
+-- !dayname_it_ch --
+mercoledì
+
+-- !dayname_ar_sa --
+الاثنين
+
+-- !dayname_ar_ae --
+الجمعة
+
+-- !dayname_ar_eg --
+السبت
+
+-- !dayname_en_us --
+Monday
+
+-- !dayname_en_gb --
+Sunday
+
+-- !dayname_en_au --
+Thursday
+
+-- !dayname_en_ca --
+Monday
+
+-- !dayname_pt_br --
+quinta-feira
+
+-- !dayname_pt_pt --
+domingo
+
+-- !dayname_nl_nl --
+donderdag
+
+-- !dayname_nl_be --
+donderdag
+
+-- !dayname_sv_se --
+tisdag
+
+-- !dayname_no_no --
+fredag
+
+-- !dayname_da_dk --
+søndag
+
+-- !dayname_fi_fi --
+maanantaina
+
+-- !dayname_pl_pl --
+czwartek
+
+-- !dayname_cs_cz --
+čtvrtek
+
+-- !dayname_hu_hu --
+kedd
+
+-- !dayname_th_th --
+วันอาทิตย์
+
+-- !dayname_vi_vn --
+Thứ Hai
+
+-- !dayname_tr_tr --
+Çarşamba
+
+-- !dayname_el_gr --
+Σάββατο
+
+-- !dayname_he_il --
+יום ראשון
+
+-- !dayname_hi_in --
+गुरुवार
+
+-- !dayname_id_id --
+Selasa
+
+-- !dayname_ms_my --
+Sabtu
+
-- !dayofweek_1 --
3
@@ -812,6 +944,225 @@ July
-- !monthname_3 --
\N
+-- !monthname_zh_cn --
+七月
+
+-- !monthname_zh_tw --
+7月
+
+-- !monthname_zh_hk --
+7月
+
+-- !monthname_fr_fr --
+juillet
+
+-- !monthname_fr_be --
+juillet
+
+-- !monthname_fr_ca --
+juillet
+
+-- !monthname_fr_ch --
+juillet
+
+-- !monthname_de_de --
+Juli
+
+-- !monthname_de_at --
+Juli
+
+-- !monthname_de_ch --
+Juli
+
+-- !monthname_ja_jp --
+7月
+
+-- !monthname_ko_kr --
+7월
+
+-- !monthname_es_es --
+julio
+
+-- !monthname_es_mx --
+julio
+
+-- !monthname_es_ar --
+julio
+
+-- !monthname_es_co --
+julio
+
+-- !monthname_it_it --
+luglio
+
+-- !monthname_it_ch --
+luglio
+
+-- !monthname_ru_ru --
+июля
+
+-- !monthname_ru_ua --
+июля
+
+-- !monthname_ar_sa --
+يوليو
+
+-- !monthname_ar_ae --
+يوليو
+
+-- !monthname_ar_eg --
+يوليو
+
+-- !monthname_ar_jo --
+تموز
+
+-- !monthname_en_us --
+July
+
+-- !monthname_en_gb --
+July
+
+-- !monthname_en_au --
+July
+
+-- !monthname_en_ca --
+July
+
+-- !monthname_pt_br --
+julho
+
+-- !monthname_pt_pt --
+julho
+
+-- !monthname_nl_nl --
+juli
+
+-- !monthname_nl_be --
+juli
+
+-- !monthname_sv_se --
+juli
+
+-- !monthname_sv_fi --
+juli
+
+-- !monthname_no_no --
+juli
+
+-- !monthname_nb_no --
+juli
+
+-- !monthname_da_dk --
+juli
+
+-- !monthname_fi_fi --
+heinäkuuta
+
+-- !monthname_pl_pl --
+lipca
+
+-- !monthname_cs_cz --
+července
+
+-- !monthname_sk_sk --
+júla
+
+-- !monthname_hu_hu --
+július
+
+-- !monthname_ro_ro --
+iulie
+
+-- !monthname_bg_bg --
+юли
+
+-- !monthname_hr_hr --
+srpnja
+
+-- !monthname_sl_si --
+julij
+
+-- !monthname_sr_rs --
+јул
+
+-- !monthname_mk_mk --
+јули
+
+-- !monthname_sq_al --
+korrik
+
+-- !monthname_th_th --
+กรกฎาคม
+
+-- !monthname_vi_vn --
+tháng 7
+
+-- !monthname_tr_tr --
+Temmuz
+
+-- !monthname_el_gr --
+Ιουλίου
+
+-- !monthname_he_il --
+יולי
+
+-- !monthname_hi_in --
+जुलाई
+
+-- !monthname_gu_in --
+જુલાઈ
+
+-- !monthname_ta_in --
+ஜூலை
+
+-- !monthname_te_in --
+జులై
+
+-- !monthname_id_id --
+Juli
+
+-- !monthname_ms_my --
+Julai
+
+-- !monthname_lt_lt --
+liepos
+
+-- !monthname_lv_lv --
+jūlijs
+
+-- !monthname_et_ee --
+juuli
+
+-- !monthname_is_is --
+júlí
+
+-- !monthname_fo_fo --
+juli
+
+-- !monthname_be_by --
+ліпеня
+
+-- !monthname_uk_ua --
+липня
+
+-- !monthname_mn_mn --
+долоодугаар сар
+
+-- !monthname_ur_pk --
+جولائی
+
+-- !monthname_ca_es --
+de juliol
+
+-- !monthname_eu_es --
+uztailak
+
+-- !monthname_gl_es --
+xullo
+
+-- !monthname_rm_ch --
+da fanadur
+
-- !months_add_1 --
2020-02-29
diff --git
a/regression-test/suites/doc/sql-manual/sql-functions/doc_date_functions_test.groovy
b/regression-test/suites/doc/sql-manual/sql-functions/doc_date_functions_test.groovy
index 23f285ad291..ac0656a15db 100644
---
a/regression-test/suites/doc/sql-manual/sql-functions/doc_date_functions_test.groovy
+++
b/regression-test/suites/doc/sql-manual/sql-functions/doc_date_functions_test.groovy
@@ -265,6 +265,191 @@ suite("doc_date_functions_test") {
qt_dayname_1 """select dayname('2007-02-03 00:00:00')"""
qt_dayname_2 """select dayname('2023-10-01')"""
qt_dayname_3 """select dayname(NULL)"""
+
+ sql """SET lc_time_names='ZH_cn'"""
+ qt_dayname_zh_cn """SELECT DAYNAME('2023-10-01')"""
+
+ sql """SET lc_time_names='zh_TW'"""
+ qt_dayname_zh_tw """SELECT DAYNAME('2024-03-15 14:30:25')"""
+
+ sql """SET lc_time_names='zh_HK'"""
+ qt_dayname_zh_hk """SELECT DAYNAME('2022-12-25')"""
+
+ sql """SET lc_time_names='fr_FR'"""
+ qt_dayname_fr_fr """SELECT DAYNAME('2023-07-14 09:15:30')"""
+
+ sql """SET lc_time_names='fr_BE'"""
+ qt_dayname_fr_be """SELECT DAYNAME('2024-01-01')"""
+
+ sql """SET lc_time_names='fr_CA'"""
+ qt_dayname_fr_ca """SELECT DAYNAME('2023-11-11 23:59:59')"""
+
+ sql """SET lc_time_names='de_DE'"""
+ qt_dayname_de_de """SELECT DAYNAME('2024-02-29')"""
+
+ sql """SET lc_time_names='DE_at'"""
+ qt_dayname_de_at """SELECT DAYNAME('2023-05-20 06:45:12')"""
+
+ sql """SET lc_time_names='de_CH'"""
+ qt_dayname_de_ch """SELECT DAYNAME('2024-08-31')"""
+
+ sql """SET lc_time_names='ja_JP'"""
+ qt_dayname_ja_jp """SELECT DAYNAME('2023-04-29 12:00:00')"""
+
+ sql """SET lc_time_names='ko_KR'"""
+ qt_dayname_ko_kr """SELECT DAYNAME('2024-09-15')"""
+
+ sql """SET lc_time_names='ES_es'"""
+ qt_dayname_es_es """SELECT DAYNAME('2023-12-31 18:30:45')"""
+
+ sql """SET lc_time_names='es_MX'"""
+ qt_dayname_es_mx """SELECT DAYNAME('2024-05-05')"""
+
+ sql """SET lc_time_names='es_AR'"""
+ qt_dayname_es_ar """SELECT DAYNAME('2023-06-21 03:15:22')"""
+
+ sql """SET lc_time_names='RU_ru'"""
+ qt_dayname_ru_ru """SELECT DAYNAME('2024-07-04')"""
+
+ sql """SET lc_time_names='ru_UA'"""
+ qt_dayname_ru_ua """SELECT DAYNAME('2023-02-14 16:45:33')"""
+
+ sql """SET lc_time_names='it_IT'"""
+ qt_dayname_it_it """SELECT DAYNAME('2024-10-12')"""
+
+ sql """SET lc_time_names='IT_ch'"""
+ qt_dayname_it_ch """SELECT DAYNAME('2023-03-08 21:20:15')"""
+
+ sql """SET lc_time_names='ar_SA'"""
+ qt_dayname_ar_sa """SELECT DAYNAME('2024-04-15')"""
+
+ sql """SET lc_time_names='ar_AE'"""
+ qt_dayname_ar_ae """SELECT DAYNAME('2023-08-25 11:30:40')"""
+
+ sql """SET lc_time_names='AR_eg'"""
+ qt_dayname_ar_eg """SELECT DAYNAME('2024-01-20')"""
+
+ sql """SET lc_time_names='en_US'"""
+ qt_dayname_en_us """SELECT DAYNAME('2023-09-11 07:45:55')"""
+
+ sql """SET lc_time_names='en_GB'"""
+ qt_dayname_en_gb """SELECT DAYNAME('2024-06-30')"""
+
+ sql """SET lc_time_names='En_Au'"""
+ qt_dayname_en_au """SELECT DAYNAME('2023-01-26 19:25:10')"""
+
+ sql """SET lc_time_names='en_CA'"""
+ qt_dayname_en_ca """SELECT DAYNAME('2024-11-11')"""
+
+ sql """SET lc_time_names='pt_BR'"""
+ qt_dayname_pt_br """SELECT DAYNAME('2023-09-07 14:15:28')"""
+
+ sql """SET lc_time_names='pt_PT'"""
+ qt_dayname_pt_pt """SELECT DAYNAME('2024-12-08')"""
+
+ sql """SET lc_time_names='nl_NL'"""
+ qt_dayname_nl_nl """SELECT DAYNAME('2023-04-27 10:30:45')"""
+
+ sql """SET lc_time_names='NL_be'"""
+ qt_dayname_nl_be """SELECT DAYNAME('2024-03-21')"""
+
+ sql """SET lc_time_names='sv_SE'"""
+ qt_dayname_sv_se """SELECT DAYNAME('2023-06-06 22:15:35')"""
+
+ sql """SET lc_time_names='no_NO'"""
+ qt_dayname_no_no """SELECT DAYNAME('2024-05-17')"""
+
+ sql """SET lc_time_names='da_DK'"""
+ qt_dayname_da_dk """SELECT DAYNAME('2023-12-03 08:20:17')"""
+
+ sql """SET lc_time_names='fi_FI'"""
+ qt_dayname_fi_fi """SELECT DAYNAME('2024-01-15')"""
+
+ sql """SET lc_time_names='pl_PL'"""
+ qt_dayname_pl_pl """SELECT DAYNAME('2023-11-30 13:45:22')"""
+
+ sql """SET lc_time_names='cs_CZ'"""
+ qt_dayname_cs_cz """SELECT DAYNAME('2024-06-20')"""
+
+ sql """SET lc_time_names='hu_HU'"""
+ qt_dayname_hu_hu """SELECT DAYNAME('2023-08-15 20:10:33')"""
+
+ sql """SET lc_time_names='th_TH'"""
+ qt_dayname_th_th """SELECT DAYNAME('2024-09-22')"""
+
+ sql """SET lc_time_names='vi_VN'"""
+ qt_dayname_vi_vn """SELECT DAYNAME('2023-05-01 15:35:44')"""
+
+ sql """SET lc_time_names='tr_TR'"""
+ qt_dayname_tr_tr """SELECT DAYNAME('2024-02-14')"""
+
+ sql """SET lc_time_names='el_GR'"""
+ qt_dayname_el_gr """SELECT DAYNAME('2023-10-28 04:25:56')"""
+
+ sql """SET lc_time_names='he_IL'"""
+ qt_dayname_he_il """SELECT DAYNAME('2024-04-07')"""
+
+ sql """SET lc_time_names='hi_IN'"""
+ qt_dayname_hi_in """SELECT DAYNAME('2023-07-20 17:55:11')"""
+
+ sql """SET lc_time_names='id_ID'"""
+ qt_dayname_id_id """SELECT DAYNAME('2024-11-05')"""
+
+ sql """SET lc_time_names='ms_MY'"""
+ qt_dayname_ms_my """SELECT DAYNAME('2023-03-18 12:40:28')"""
+
+ sql """SET lc_time_names='ar_AE'"""
+ testFoldConst("SELECT DAYNAME('2023-08-15 20:10:33');")
+
+ sql """SET lc_time_names='zh_CN'"""
+ testFoldConst("SELECT DAYNAME('2024-09-22');")
+
+ sql """SET lc_time_names='ja_JP'"""
+ testFoldConst("SELECT DAYNAME('2023-05-01 15:35:44');")
+
+ sql """SET lc_time_names='ko_KR'"""
+ testFoldConst("SELECT DAYNAME('2024-02-14');")
+
+ sql """SET lc_time_names='ru_RU'"""
+ testFoldConst("SELECT DAYNAME('2023-10-28 04:25:56');")
+
+ sql """SET lc_time_names='de_DE'"""
+ testFoldConst("SELECT DAYNAME('2024-04-07');")
+
+ sql """SET lc_time_names='fr_FR'"""
+ testFoldConst("SELECT DAYNAME('2023-07-20 17:55:11');")
+
+ sql """SET lc_time_names='es_ES'"""
+ testFoldConst("SELECT DAYNAME('2024-11-05');")
+
+ sql """SET lc_time_names='pt_BR'"""
+ testFoldConst("SELECT DAYNAME('2023-03-18 12:40:28');")
+
+ sql """SET lc_time_names='it_IT'"""
+ testFoldConst("SELECT DAYNAME('2024-01-01');")
+
+ sql """SET lc_time_names='nl_NL'"""
+ testFoldConst("SELECT DAYNAME('2023-12-31');")
+
+ sql """SET lc_time_names='sv_SE'"""
+ testFoldConst("SELECT DAYNAME('2024-06-30 23:59:59');")
+
+ sql """SET lc_time_names='pl_PL'"""
+ testFoldConst("SELECT DAYNAME('2023-02-28');")
+
+ sql """SET lc_time_names='cs_CZ'"""
+ testFoldConst("SELECT DAYNAME('2024-02-29');")
+
+ sql """SET lc_time_names='bg_BG'"""
+ testFoldConst("SELECT DAYNAME('1970-01-01');")
+
+ sql """SET lc_time_names='uk_UA'"""
+ testFoldConst("SELECT DAYNAME('2038-01-19');")
+
+ sql """SET lc_time_names='en_US'"""
+ testFoldConst("SELECT DAYNAME(NULL);")
+
+ sql """SET lc_time_names=default"""
// 17. DAYOFWEEK function tests
qt_dayofweek_1 """select dayofweek('2019-06-25')"""
@@ -543,6 +728,275 @@ suite("doc_date_functions_test") {
qt_monthname_2 """SELECT MONTHNAME('2023-07-13 22:28:18')"""
qt_monthname_3 """SELECT MONTHNAME(NULL)"""
+ sql """SET lc_time_names='zh_CN'"""
+ qt_monthname_zh_cn """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='zh_TW'"""
+ qt_monthname_zh_tw """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='zh_HK'"""
+ qt_monthname_zh_hk """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='FR_fr'"""
+ qt_monthname_fr_fr """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='fr_BE'"""
+ qt_monthname_fr_be """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='fr_CA'"""
+ qt_monthname_fr_ca """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='fr_CH'"""
+ qt_monthname_fr_ch """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='de_DE'"""
+ qt_monthname_de_de """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='de_AT'"""
+ qt_monthname_de_at """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='DE_ch'"""
+ qt_monthname_de_ch """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='JA_jp'"""
+ qt_monthname_ja_jp """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='Ko_KR'"""
+ qt_monthname_ko_kr """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='es_ES'"""
+ qt_monthname_es_es """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='es_MX'"""
+ qt_monthname_es_mx """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='Es_Ar'"""
+ qt_monthname_es_ar """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='es_CO'"""
+ qt_monthname_es_co """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='IT_it'"""
+ qt_monthname_it_it """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='it_CH'"""
+ qt_monthname_it_ch """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ru_RU'"""
+ qt_monthname_ru_ru """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='RU_ua'"""
+ qt_monthname_ru_ua """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ar_SA'"""
+ qt_monthname_ar_sa """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ar_AE'"""
+ qt_monthname_ar_ae """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='AR_eg'"""
+ qt_monthname_ar_eg """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ar_JO'"""
+ qt_monthname_ar_jo """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='en_US'"""
+ qt_monthname_en_us """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='en_GB'"""
+ qt_monthname_en_gb """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='En_Au'"""
+ qt_monthname_en_au """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='en_CA'"""
+ qt_monthname_en_ca """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='pt_BR'"""
+ qt_monthname_pt_br """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='pt_PT'"""
+ qt_monthname_pt_pt """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='nl_NL'"""
+ qt_monthname_nl_nl """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='NL_be'"""
+ qt_monthname_nl_be """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sv_SE'"""
+ qt_monthname_sv_se """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sv_FI'"""
+ qt_monthname_sv_fi """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='no_NO'"""
+ qt_monthname_no_no """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='nb_NO'"""
+ qt_monthname_nb_no """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='da_DK'"""
+ qt_monthname_da_dk """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='fi_FI'"""
+ qt_monthname_fi_fi """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='pl_PL'"""
+ qt_monthname_pl_pl """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='cs_CZ'"""
+ qt_monthname_cs_cz """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sk_SK'"""
+ qt_monthname_sk_sk """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='hu_HU'"""
+ qt_monthname_hu_hu """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ro_RO'"""
+ qt_monthname_ro_ro """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='bg_BG'"""
+ qt_monthname_bg_bg """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='hr_HR'"""
+ qt_monthname_hr_hr """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sl_SI'"""
+ qt_monthname_sl_si """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sr_RS'"""
+ qt_monthname_sr_rs """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='mk_MK'"""
+ qt_monthname_mk_mk """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='sq_AL'"""
+ qt_monthname_sq_al """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='th_TH'"""
+ qt_monthname_th_th """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='vi_VN'"""
+ qt_monthname_vi_vn """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='tr_TR'"""
+ qt_monthname_tr_tr """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='el_GR'"""
+ qt_monthname_el_gr """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='he_IL'"""
+ qt_monthname_he_il """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='hi_IN'"""
+ qt_monthname_hi_in """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='gu_IN'"""
+ qt_monthname_gu_in """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ta_IN'"""
+ qt_monthname_ta_in """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='te_IN'"""
+ qt_monthname_te_in """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='id_ID'"""
+ qt_monthname_id_id """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ms_MY'"""
+ qt_monthname_ms_my """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='lt_LT'"""
+ qt_monthname_lt_lt """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='lv_LV'"""
+ qt_monthname_lv_lv """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='et_EE'"""
+ qt_monthname_et_ee """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='is_IS'"""
+ qt_monthname_is_is """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='fo_FO'"""
+ qt_monthname_fo_fo """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='be_BY'"""
+ qt_monthname_be_by """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='uk_UA'"""
+ qt_monthname_uk_ua """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='mn_MN'"""
+ qt_monthname_mn_mn """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ur_PK'"""
+ qt_monthname_ur_pk """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ca_ES'"""
+ qt_monthname_ca_es """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='eu_ES'"""
+ qt_monthname_eu_es """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='gl_ES'"""
+ qt_monthname_gl_es """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='rm_CH'"""
+ qt_monthname_rm_ch """SELECT MONTHNAME('2023-07-13')"""
+
+ sql """SET lc_time_names='ar_AE'"""
+ testFoldConst("SELECT MONTHNAME('2023-01-15');")
+
+ sql """SET lc_time_names='zh_CN'"""
+ testFoldConst("SELECT MONTHNAME('2023-02-20');")
+
+ sql """SET lc_time_names='ja_JP'"""
+ testFoldConst("SELECT MONTHNAME('2023-03-25');")
+
+ sql """SET lc_time_names='ko_KR'"""
+ testFoldConst("SELECT MONTHNAME('2023-04-10');")
+
+ sql """SET lc_time_names='ru_RU'"""
+ testFoldConst("SELECT MONTHNAME('2023-05-18');")
+
+ sql """SET lc_time_names='de_DE'"""
+ testFoldConst("SELECT MONTHNAME('2023-06-22');")
+
+ sql """SET lc_time_names='fr_FR'"""
+ testFoldConst("SELECT MONTHNAME('2023-07-13');")
+
+ sql """SET lc_time_names='es_ES'"""
+ testFoldConst("SELECT MONTHNAME('2023-08-05');")
+
+ sql """SET lc_time_names='pt_BR'"""
+ testFoldConst("SELECT MONTHNAME('2023-09-30');")
+
+ sql """SET lc_time_names='it_IT'"""
+ testFoldConst("SELECT MONTHNAME('2023-10-12');")
+
+ sql """SET lc_time_names='nl_NL'"""
+ testFoldConst("SELECT MONTHNAME('2023-11-28');")
+
+ sql """SET lc_time_names='sv_SE'"""
+ testFoldConst("SELECT MONTHNAME('2023-12-01');")
+
+ sql """SET lc_time_names='pl_PL'"""
+ testFoldConst("SELECT MONTHNAME('2024-01-31');")
+
+ sql """SET lc_time_names='cs_CZ'"""
+ testFoldConst("SELECT MONTHNAME('2024-02-29');")
+
+ sql """SET lc_time_names='bg_BG'"""
+ testFoldConst("SELECT MONTHNAME('2024-03-15');")
+
+ sql """SET lc_time_names='uk_UA'"""
+ testFoldConst("SELECT MONTHNAME('2024-04-01');")
+
+ sql """SET lc_time_names=default"""
+
// 54. MONTHS_ADD function tests
qt_months_add_1 """SELECT MONTHS_ADD('2020-01-31', 1)"""
qt_months_add_2 """SELECT MONTHS_ADD('2020-01-31 02:02:02', 1)"""
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]