in velox/functions/lib/DateTimeFormatter.cpp [307:429]
std::shared_ptr<DateTimeFormatter> buildMysqlDateTimeFormatter(
const std::string_view& format) {
// For %r we should reserve 1 extra space because it has 3 literals ':' ':'
// and ' '
DateTimeFormatterBuilder builder(
format.size() + countOccurence(format, "%r"));
const char* cur = format.data();
const char* end = cur + format.size();
while (cur < end) {
auto tokenEnd = cur;
if (*tokenEnd == '%') { // pattern
++tokenEnd;
if (tokenEnd == end) {
break;
}
switch (*tokenEnd) {
case 'a':
builder.appendDayOfWeekText(3);
break;
case 'b':
builder.appendMonthOfYearText(3);
break;
case 'c':
builder.appendMonthOfYear(1);
break;
case 'd':
builder.appendDayOfMonth(2);
break;
case 'e':
builder.appendDayOfMonth(1);
break;
case 'f':
builder.appendFractionOfSecond(6);
break;
case 'H':
builder.appendHourOfDay(2);
break;
case 'h':
case 'I':
builder.appendClockHourOfHalfDay(2);
break;
case 'i':
builder.appendMinuteOfHour(2);
break;
case 'j':
builder.appendDayOfYear(3);
break;
case 'k':
builder.appendHourOfDay(1);
break;
case 'l':
builder.appendClockHourOfHalfDay(1);
break;
case 'M':
builder.appendMonthOfYearText(4);
break;
case 'm':
builder.appendMonthOfYear(2);
break;
case 'p':
builder.appendHalfDayOfDay();
break;
case 'r':
builder.appendClockHourOfHalfDay(2);
builder.appendLiteral(":");
builder.appendMinuteOfHour(2);
builder.appendLiteral(":");
builder.appendSecondOfMinute(2);
builder.appendLiteral(" ");
builder.appendHalfDayOfDay();
break;
case 'S':
case 's':
builder.appendSecondOfMinute(2);
break;
case 'T':
builder.appendHourOfDay(2);
builder.appendLiteral(":");
builder.appendMinuteOfHour(2);
builder.appendLiteral(":");
builder.appendSecondOfMinute(2);
break;
case 'v':
builder.appendWeekOfWeekYear(2);
break;
case 'W':
builder.appendDayOfWeekText(4);
break;
case 'x':
builder.appendWeekYear(4);
break;
case 'Y':
builder.appendYear(4);
break;
case 'y':
builder.appendYear(2);
break;
case '%':
builder.appendLiteral("%");
break;
case 'D':
case 'U':
case 'u':
case 'V':
case 'w':
case 'X':
VELOX_UNSUPPORTED("Specifier {} is not supported.", *tokenEnd)
default:
builder.appendLiteral(tokenEnd, 1);
break;
}
++tokenEnd;
} else {
while (tokenEnd < end && *tokenEnd != '%') {
++tokenEnd;
}
builder.appendLiteral(cur, tokenEnd - cur);
}
cur = tokenEnd;
}
return builder.build();
}