Merge pull request #11324 from ClickHouse/improve-performance-of-client-interactive-mode

Add setting "output_format_pretty_max_value_width".
This commit is contained in:
alexey-milovidov 2020-06-03 00:17:29 +03:00 committed by GitHub
commit 6864016e22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 478 additions and 227 deletions

View File

@ -89,7 +89,18 @@ static int wcwidth(wchar_t wc)
}
}
size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
namespace
{
enum ComputeWidthMode
{
Width, /// Calcualte and return visible width
BytesBeforLimit /// Calculate and return the maximum number of bytes when substring fits in visible width.
};
template <ComputeWidthMode mode>
static size_t computeWidthImpl(const UInt8 * data, size_t size, size_t prefix, size_t limit) noexcept
{
UTF8Decoder decoder;
size_t width = 0;
@ -132,16 +143,24 @@ size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
++i;
}
/// Now i points to position in bytes after regular ASCII sequence
/// and if width > limit, then (width - limit) is the number of extra ASCII characters after width limit.
if (mode == BytesBeforLimit && width > limit)
return i - (width - limit);
switch (decoder.decode(data[i]))
{
case UTF8Decoder::REJECT:
{
decoder.reset();
// invalid sequences seem to have zero width in modern terminals
// tested in libvte-based, alacritty, urxvt and xterm
i -= rollback;
rollback = 0;
break;
}
case UTF8Decoder::ACCEPT:
{
// there are special control characters that manipulate the terminal output.
// (`0x08`, `0x09`, `0x0a`, `0x0b`, `0x0c`, `0x0d`, `0x1b`)
// Since we don't touch the original column data, there is no easy way to escape them.
@ -149,12 +168,19 @@ size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
// TODO: multiline support for '\n'
// special treatment for '\t'
size_t next_width = width;
if (decoder.codepoint == '\t')
width += 8 - (prefix + width) % 8;
next_width += 8 - (prefix + width) % 8;
else
width += wcwidth(decoder.codepoint);
next_width += wcwidth(decoder.codepoint);
if (mode == BytesBeforLimit && next_width > limit)
return i - rollback;
width = next_width;
rollback = 0;
break;
}
// continue if we meet other values here
default:
++rollback;
@ -162,7 +188,21 @@ size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
}
// no need to handle trailing sequence as they have zero width
return width;
}
return (mode == BytesBeforLimit) ? size : width;
}
}
size_t computeWidth(const UInt8 * data, size_t size, size_t prefix) noexcept
{
return computeWidthImpl<Width>(data, size, prefix, 0);
}
size_t computeBytesBeforeWidth(const UInt8 * data, size_t size, size_t prefix, size_t limit) noexcept
{
return computeWidthImpl<BytesBeforLimit>(data, size, prefix, limit);
}
}
}

View File

@ -99,6 +99,19 @@ int queryConvert(const CharT * bytes, int length)
/// and include `\t` to the nearest longer length with multiple of eight.
size_t computeWidth(const UInt8 * data, size_t size, size_t prefix = 0) noexcept;
/** Calculate the maximum number of bytes, so that substring of this size fits in 'limit' width.
*
* For example, we have string "x你好", it has 3 code points and visible width of 5 and byte size of 7.
* Suppose we have limit = 3.
* Then we have to return 4 as maximum number of bytes
* and the truncated string will be "x你": two code points, visible width 3, byte size 4.
*
* The same result will be for limit 4, because the last character would not fit.
*/
size_t computeBytesBeforeWidth(const UInt8 * data, size_t size, size_t prefix, size_t limit) noexcept;
}

View File

@ -211,6 +211,7 @@ struct Settings : public SettingsCollection<Settings>
\
M(SettingUInt64, output_format_pretty_max_rows, 10000, "Rows limit for Pretty formats.", 0) \
M(SettingUInt64, output_format_pretty_max_column_pad_width, 250, "Maximum width to pad all values in a column in Pretty formats.", 0) \
M(SettingUInt64, output_format_pretty_max_value_width, 10000, "Maximum width of value to display in Pretty formats. If greater - it will be cut.", 0) \
M(SettingBool, output_format_pretty_color, true, "Use ANSI escape sequences to paint colors in Pretty formats", 0) \
M(SettingUInt64, output_format_parquet_row_group_size, 1000000, "Row group size in rows.", 0) \
M(SettingString, output_format_avro_codec, "", "Compression codec used for output. Possible values: 'null', 'deflate', 'snappy'.", 0) \

View File

@ -101,6 +101,7 @@ static FormatSettings getOutputFormatSetting(const Settings & settings, const Co
format_settings.csv.crlf_end_of_line = settings.output_format_csv_crlf_end_of_line;
format_settings.pretty.max_rows = settings.output_format_pretty_max_rows;
format_settings.pretty.max_column_pad_width = settings.output_format_pretty_max_column_pad_width;
format_settings.pretty.max_value_width = settings.output_format_pretty_max_value_width;
format_settings.pretty.color = settings.output_format_pretty_color;
format_settings.template_settings.resultset_format = settings.format_template_resultset;
format_settings.template_settings.row_format = settings.format_template_row;

View File

@ -42,6 +42,7 @@ struct FormatSettings
{
UInt64 max_rows = 10000;
UInt64 max_column_pad_width = 250;
UInt64 max_value_width = 10000;
bool color = true;
};

View File

@ -30,14 +30,14 @@ PrettyBlockOutputFormat::PrettyBlockOutputFormat(
/// Note that number of code points is just a rough approximation of visible string width.
void PrettyBlockOutputFormat::calculateWidths(
const Block & header, const Chunk & chunk,
WidthsPerColumn & widths, Widths & max_widths, Widths & name_widths)
WidthsPerColumn & widths, Widths & max_padded_widths, Widths & name_widths)
{
size_t num_rows = chunk.getNumRows();
size_t num_rows = std::min(chunk.getNumRows(), format_settings.pretty.max_rows);
size_t num_columns = chunk.getNumColumns();
const auto & columns = chunk.getColumns();
widths.resize(num_columns);
max_widths.resize_fill(num_columns);
max_padded_widths.resize_fill(num_columns);
name_widths.resize(num_columns);
/// Calculate widths of all values.
@ -57,9 +57,21 @@ void PrettyBlockOutputFormat::calculateWidths(
elem.type->serializeAsText(*column, j, out_serialize, format_settings);
}
widths[i][j] = std::min<UInt64>(format_settings.pretty.max_column_pad_width,
UTF8::computeWidth(reinterpret_cast<const UInt8 *>(serialized_value.data()), serialized_value.size(), prefix));
max_widths[i] = std::max(max_widths[i], widths[i][j]);
/// Avoid calculating width of too long strings by limiting the size in bytes.
/// Note that it is just an estimation. 4 is the maximum size of Unicode code point in bytes in UTF-8.
/// But it's possible that the string is long in bytes but very short in visible size.
/// (e.g. non-printable characters, diacritics, combining characters)
if (format_settings.pretty.max_value_width)
{
size_t max_byte_size = format_settings.pretty.max_value_width * 4;
if (serialized_value.size() > max_byte_size)
serialized_value.resize(max_byte_size);
}
widths[i][j] = UTF8::computeWidth(reinterpret_cast<const UInt8 *>(serialized_value.data()), serialized_value.size(), prefix);
max_padded_widths[i] = std::max<UInt64>(max_padded_widths[i],
std::min<UInt64>(format_settings.pretty.max_column_pad_width,
std::min<UInt64>(format_settings.pretty.max_value_width, widths[i][j])));
}
/// And also calculate widths for names of columns.
@ -67,9 +79,9 @@ void PrettyBlockOutputFormat::calculateWidths(
// name string doesn't contain Tab, no need to pass `prefix`
name_widths[i] = std::min<UInt64>(format_settings.pretty.max_column_pad_width,
UTF8::computeWidth(reinterpret_cast<const UInt8 *>(elem.name.data()), elem.name.size()));
max_widths[i] = std::max(max_widths[i], name_widths[i]);
max_padded_widths[i] = std::max<UInt64>(max_padded_widths[i], name_widths[i]);
}
prefix += max_widths[i] + 3;
prefix += max_padded_widths[i] + 3;
}
}
@ -174,18 +186,20 @@ void PrettyBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind)
if (i != 0)
writeString(middle_values_separator_s, out);
writeCString(" ", out);
writeCString("", out);
for (size_t j = 0; j < num_columns; ++j)
{
if (j != 0)
writeCString(" ", out);
writeCString("", out);
const auto & type = *header.getByPosition(j).type;
writeValueWithPadding(*columns[j], type, i, widths[j].empty() ? max_widths[j] : widths[j][i], max_widths[j]);
writeValueWithPadding(*columns[j], type, i,
widths[j].empty() ? max_widths[j] : widths[j][i],
max_widths[j]);
}
writeCString(" \n", out);
writeCString("\n", out);
}
writeString(bottom_separator_s, out);
@ -197,20 +211,42 @@ void PrettyBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind)
void PrettyBlockOutputFormat::writeValueWithPadding(
const IColumn & column, const IDataType & type, size_t row_num, size_t value_width, size_t pad_to_width)
{
String serialized_value = " ";
{
WriteBufferFromString out_serialize(serialized_value, WriteBufferFromString::AppendModeTag());
type.serializeAsText(column, row_num, out_serialize, format_settings);
}
if (value_width > format_settings.pretty.max_value_width)
{
serialized_value.resize(UTF8::computeBytesBeforeWidth(
reinterpret_cast<const UInt8 *>(serialized_value.data()), serialized_value.size(), 0, 1 + format_settings.pretty.max_value_width));
if (format_settings.pretty.color)
serialized_value += "\033[31;1m⋯\033[0m";
else
serialized_value += "";
value_width = format_settings.pretty.max_value_width;
}
else
serialized_value += ' ';
auto write_padding = [&]()
{
for (size_t k = 0; k < pad_to_width - value_width; ++k)
writeChar(' ', out);
if (pad_to_width > value_width)
for (size_t k = 0; k < pad_to_width - value_width; ++k)
writeChar(' ', out);
};
if (type.shouldAlignRightInPrettyFormats())
{
write_padding();
type.serializeAsText(column, row_num, out, format_settings);
out.write(serialized_value.data(), serialized_value.size());
}
else
{
type.serializeAsText(column, row_num, out, format_settings);
out.write(serialized_value.data(), serialized_value.size());
write_padding();
}
}

View File

@ -52,7 +52,7 @@ protected:
void calculateWidths(
const Block & header, const Chunk & chunk,
WidthsPerColumn & widths, Widths & max_widths, Widths & name_widths);
WidthsPerColumn & widths, Widths & max_padded_widths, Widths & name_widths);
void writeValueWithPadding(
const IColumn & column, const IDataType & type, size_t row_num, size_t value_width, size_t pad_to_width);

View File

@ -83,19 +83,19 @@ void PrettyCompactBlockOutputFormat::writeRow(
{
size_t num_columns = max_widths.size();
writeCString(" ", out);
writeCString("", out);
for (size_t j = 0; j < num_columns; ++j)
{
if (j != 0)
writeCString(" ", out);
writeCString("", out);
const auto & type = *header.getByPosition(j).type;
const auto & cur_widths = widths[j].empty() ? max_widths[j] : widths[j][row_num];
writeValueWithPadding(*columns[j], type, row_num, cur_widths, max_widths[j]);
}
writeCString(" \n", out);
writeCString("\n", out);
}
void PrettyCompactBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind)

View File

@ -34,6 +34,8 @@ void PrettySpaceBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind
{
if (i != 0)
writeCString(" ", out);
else
writeChar(' ', out);
const ColumnWithTypeAndName & col = header.getByPosition(i);
@ -67,7 +69,7 @@ void PrettySpaceBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind
for (size_t column = 0; column < num_columns; ++column)
{
if (column != 0)
writeCString(" ", out);
writeCString(" ", out);
const auto & type = *header.getByPosition(column).type;
auto & cur_width = widths[column].empty() ? max_widths[column] : widths[column][row];

View File

@ -1,18 +1,18 @@
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

View File

@ -1,19 +1,19 @@
name value changed
name value changed
max_rows_to_read 10000 1
readonly 0 0
name value changed
max_rows_to_read 10000 1
readonly 0 0
name value changed
max_rows_to_read 10000 1
readonly 2 1
name value changed
max_rows_to_read 10000 1
readonly 2 1
name value changed
max_rows_to_read 10000 1
readonly 1 1
name value changed
max_rows_to_read 10000 1
readonly 1 1
name value changed
max_rows_to_read 10000 1
readonly 2 1
max_rows_to_read 10000 1
readonly 2 1
Ok
Ok
0

View File

@ -38,20 +38,20 @@
│ 8 │ 8 │ (8,'8') │ 2 │
│ 9 │ 9 │ (9,'9') │ ᴺᵁᴸᴸ │
└───────┴───────┴─────────┴─────────────────┘
hello world tuple sometimes_nulls
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
5 5 (5,'5') 2
6 6 (6,'6') ᴺᵁᴸᴸ
7 7 (7,'7') 1
8 8 (8,'8') 2
9 9 (9,'9') ᴺᵁᴸᴸ
5 5 (5,'5') 2
6 6 (6,'6') ᴺᵁᴸᴸ
7 7 (7,'7') 1
8 8 (8,'8') 2
9 9 (9,'9') ᴺᵁᴸᴸ
┌─hello─┬─world─┬─tuple───┬─sometimes_nulls─┐
│ 0 │ 0 │ (0,'0') │ ᴺᵁᴸᴸ │
│ 1 │ 1 │ (1,'1') │ 1 │
@ -104,20 +104,20 @@
│ 8 │ 8 │ (8,'8') │ 2 │
│ 9 │ 9 │ (9,'9') │ ᴺᵁᴸᴸ │
└───────┴───────┴─────────┴─────────────────┘
hello world tuple sometimes_nulls
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
5 5 (5,'5') 2
6 6 (6,'6') ᴺᵁᴸᴸ
7 7 (7,'7') 1
8 8 (8,'8') 2
9 9 (9,'9') ᴺᵁᴸᴸ
5 5 (5,'5') 2
6 6 (6,'6') ᴺᵁᴸᴸ
7 7 (7,'7') 1
8 8 (8,'8') 2
9 9 (9,'9') ᴺᵁᴸᴸ
┏━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
hello ┃ world ┃ tuple  ┃ sometimes_nulls ┃
┡━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
@ -148,16 +148,16 @@ hello world tuple sometimes_nulls
│ 5 │ 5 │ (5,'5') │ 2 │
└───────┴───────┴─────────┴─────────────────┘
Showed first 6.
hello world tuple sometimes_nulls
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
5 5 (5,'5') 2
5 5 (5,'5') 2
Showed first 6.
┌─hello─┬─world─┬─tuple───┬─sometimes_nulls─┐
@ -199,15 +199,15 @@ Showed first 6.
│ 5 │ 5 │ (5,'5') │ 2 │
└───────┴───────┴─────────┴─────────────────┘
Showed first 6.
hello world tuple sometimes_nulls
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
0 0 (0,'0') ᴺᵁᴸᴸ
1 1 (1,'1') 1
2 2 (2,'2') 2
3 3 (3,'3') ᴺᵁᴸᴸ
4 4 (4,'4') 1
hello world tuple sometimes_nulls
5 5 (5,'5') 2
5 5 (5,'5') 2
Showed first 6.

View File

@ -33,18 +33,18 @@
│ 100000000 │ 100000000 │
│ 1000000000 │ 1000000000 │
└────────────┴────────────┘
x s
x s
1 1
10 10
100 100
1000 1000
10000 10000
100000 100000
1000000 1000000
10000000 10000000
100000000 100000000
1000000000 1000000000
1 1
10 10
100 100
1000 1000
10000 10000
100000 100000
1000000 1000000
10000000 10000000
100000000 100000000
1000000000 1000000000
┌──────────x─┬─s──────────┐
│ 1 │ 1 │
│ 10 │ 10 │

View File

@ -1,106 +1,106 @@
s a b
s a b
0 2000-01-01 00:00:00 2000-01-01 00:00:00
0000 2000-01-01 00:00:00 2000-01-01 00:00:00
00:00:00 2000-01-01 00:00:00 2000-01-01 00:00:00
01:00:00 2000-01-01 01:00:00 2000-01-01 01:00:00
02/01/17 010203 MSK 2017-01-01 22:02:03 2017-01-01 22:02:03
02/01/17 010203 MSK+0100 2017-01-01 21:02:03 2017-01-01 21:02:03
02/01/17 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
02/01/17 010203Z 2017-01-02 01:02:03 2017-01-02 01:02:03
02/01/1970 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
02/01/70 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50
17 Apr 2 1:2:3 2000-04-17 01:02:03 2000-04-17 01:02:03
19700102 01:00:00 1970-01-02 01:00:00 1970-01-02 01:00:00
1970010201:00:00 2032-06-06 02:03:21 2032-06-06 02:03:21
19700102010203 1970-01-02 01:02:03 1970-01-02 01:02:03
19700102010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
1970/01/02 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
20 2000-01-20 00:00:00 2000-01-20 00:00:00
201 ᴺᵁᴸᴸ 0000-00-00 00:00:00
20160101 2016-01-01 00:00:00 2016-01-01 00:00:00
2016-01-01 2016-01-01 00:00:00 2016-01-01 00:00:00
201601-01 2016-01-01 01:00:00 2016-01-01 01:00:00
2016-01-01MSD 2015-12-31 20:00:00 2015-12-31 20:00:00
2016-01-01 MSD 2015-12-31 20:00:00 2015-12-31 20:00:00
201601-01 MSD 2016-01-01 04:00:00 2016-01-01 04:00:00
2016-01-01UTC 2016-01-01 00:00:00 2016-01-01 00:00:00
2016-01-01Z 2016-01-01 00:00:00 2016-01-01 00:00:00
2017 2017-01-01 00:00:00 2017-01-01 00:00:00
2017/01/00 2017-01-01 00:00:00 2017-01-01 00:00:00
2017/01/00 MSD 2016-12-31 20:00:00 2016-12-31 20:00:00
2017/01/00 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
2017/01/01 2017-01-01 00:00:00 2017-01-01 00:00:00
201701 02 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
2017-01-02 03:04:05 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-0203:04:05 ᴺᵁᴸᴸ 0000-00-00 00:00:00
2017-01-02 03:04:05+0 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05+00 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05+0000 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05 -0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02 03:04:05+030 2017-01-02 02:34:05 2017-01-02 02:34:05
2017-01-02 03:04:05+0300 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02 03:04:05+1 2017-01-02 02:04:05 2017-01-02 02:04:05
2017-01-02 03:04:05+300 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02 03:04:05+900 2017-01-01 18:04:05 2017-01-01 18:04:05
2017-01-02 03:04:05GMT 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05 MSD 2017-01-01 23:04:05 2017-01-01 23:04:05
2017-01-02 03:04:05 MSD Feb 2017-02-01 23:04:05 2017-02-01 23:04:05
2017-01-02 03:04:05 MSD Jun 2017-06-01 23:04:05 2017-06-01 23:04:05
2017-01-02 03:04:05 MSK 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02T03:04:05 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02T03:04:05+00 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02T03:04:05 -0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02T03:04:05-0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02T03:04:05+0100 2017-01-02 02:04:05 2017-01-02 02:04:05
2017-01-02T03:04:05Z 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01 03:04:05 MSD Jun 2017-05-31 23:04:05 2017-05-31 23:04:05
2017-01 03:04 MSD Jun 2017-05-31 23:04:00 2017-05-31 23:04:00
2017/01/31 2017-01-31 00:00:00 2017-01-31 00:00:00
2017/01/32 0000-00-00 00:00:00 0000-00-00 00:00:00
2017-01 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
201701 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
2017 25 1:2:3 0000-00-00 00:00:00 0000-00-00 00:00:00
2017 25 Apr 1:2:3 2017-04-01 01:02:03 2017-04-01 01:02:03
2017 Apr 01 11:22:33 2017-04-01 11:22:33 2017-04-01 11:22:33
2017 Apr 02 01/02/03 UTC+0300 ᴺᵁᴸᴸ 0000-00-00 00:00:00
2017 Apr 02 010203 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 01:2:3 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:02:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 11:22:33 2017-04-02 11:22:33 2017-04-02 11:22:33
2017 Apr 02 1:2:03 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:22:33 2017-04-02 01:22:33 2017-04-02 01:22:33
2017 Apr 02 1:2:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:2:33 2017-04-02 01:02:33 2017-04-02 01:02:33
2017 Apr 02 1:2:3 MSK 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 MSK 2017 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 MSK 2018 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 UTC+0000 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:2:3 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 UTC+0400 2017-04-01 21:02:03 2017-04-01 21:02:03
2017 Apr 2 1:2:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Jan 02 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
25 Apr 2017 01:02:03 2017-04-25 01:02:03 2017-04-25 01:02:03
25 Apr 2017 1:2:3 2017-04-25 01:02:03 2017-04-25 01:02:03
25 Jan 2017 1:2:3 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 MSK 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3Z 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 Z 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 Z +0300 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 Z+03:00 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 Z +0300 OM ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3 Z +03:00 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z +0300 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z+03:00 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z +03:30 PM 2017-01-25 09:32:03 2017-01-25 09:32:03
25 Jan 2017 1:2:3Z Mo ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3Z Mon 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3Z Moo ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3 Z PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3Z PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3 Z PM +03:00 2017-01-25 10:02:03 2017-01-25 10:02:03
Jun, 11 Feb 2018 06:40:50 +0300 2000-06-01 00:00:00 2000-06-01 00:00:00
Sun 11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50
Sun, 11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50
0 2000-01-01 00:00:00 2000-01-01 00:00:00
0000 2000-01-01 00:00:00 2000-01-01 00:00:00
00:00:00 2000-01-01 00:00:00 2000-01-01 00:00:00
01:00:00 2000-01-01 01:00:00 2000-01-01 01:00:00
02/01/17 010203 MSK 2017-01-01 22:02:03 2017-01-01 22:02:03
02/01/17 010203 MSK+0100 2017-01-01 21:02:03 2017-01-01 21:02:03
02/01/17 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
02/01/17 010203Z 2017-01-02 01:02:03 2017-01-02 01:02:03
02/01/1970 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
02/01/70 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50
17 Apr 2 1:2:3 2000-04-17 01:02:03 2000-04-17 01:02:03
19700102 01:00:00 1970-01-02 01:00:00 1970-01-02 01:00:00
1970010201:00:00 2032-06-06 02:03:21 2032-06-06 02:03:21
19700102010203 1970-01-02 01:02:03 1970-01-02 01:02:03
19700102010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
1970/01/02 010203Z 1970-01-02 01:02:03 1970-01-02 01:02:03
20 2000-01-20 00:00:00 2000-01-20 00:00:00
201 ᴺᵁᴸᴸ 0000-00-00 00:00:00
20160101 2016-01-01 00:00:00 2016-01-01 00:00:00
2016-01-01 2016-01-01 00:00:00 2016-01-01 00:00:00
201601-01 2016-01-01 01:00:00 2016-01-01 01:00:00
2016-01-01MSD 2015-12-31 20:00:00 2015-12-31 20:00:00
2016-01-01 MSD 2015-12-31 20:00:00 2015-12-31 20:00:00
201601-01 MSD 2016-01-01 04:00:00 2016-01-01 04:00:00
2016-01-01UTC 2016-01-01 00:00:00 2016-01-01 00:00:00
2016-01-01Z 2016-01-01 00:00:00 2016-01-01 00:00:00
2017 2017-01-01 00:00:00 2017-01-01 00:00:00
2017/01/00 2017-01-01 00:00:00 2017-01-01 00:00:00
2017/01/00 MSD 2016-12-31 20:00:00 2016-12-31 20:00:00
2017/01/00 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
2017/01/01 2017-01-01 00:00:00 2017-01-01 00:00:00
201701 02 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
2017-01-02 03:04:05 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-0203:04:05 ᴺᵁᴸᴸ 0000-00-00 00:00:00
2017-01-02 03:04:05+0 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05+00 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05+0000 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05 -0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02 03:04:05+030 2017-01-02 02:34:05 2017-01-02 02:34:05
2017-01-02 03:04:05+0300 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02 03:04:05+1 2017-01-02 02:04:05 2017-01-02 02:04:05
2017-01-02 03:04:05+300 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02 03:04:05+900 2017-01-01 18:04:05 2017-01-01 18:04:05
2017-01-02 03:04:05GMT 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02 03:04:05 MSD 2017-01-01 23:04:05 2017-01-01 23:04:05
2017-01-02 03:04:05 MSD Feb 2017-02-01 23:04:05 2017-02-01 23:04:05
2017-01-02 03:04:05 MSD Jun 2017-06-01 23:04:05 2017-06-01 23:04:05
2017-01-02 03:04:05 MSK 2017-01-02 00:04:05 2017-01-02 00:04:05
2017-01-02T03:04:05 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02T03:04:05+00 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01-02T03:04:05 -0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02T03:04:05-0100 2017-01-02 04:04:05 2017-01-02 04:04:05
2017-01-02T03:04:05+0100 2017-01-02 02:04:05 2017-01-02 02:04:05
2017-01-02T03:04:05Z 2017-01-02 03:04:05 2017-01-02 03:04:05
2017-01 03:04:05 MSD Jun 2017-05-31 23:04:05 2017-05-31 23:04:05
2017-01 03:04 MSD Jun 2017-05-31 23:04:00 2017-05-31 23:04:00
2017/01/31 2017-01-31 00:00:00 2017-01-31 00:00:00
2017/01/32 0000-00-00 00:00:00 0000-00-00 00:00:00
2017-01 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
201701 MSD Jun 2017-05-31 20:00:00 2017-05-31 20:00:00
2017 25 1:2:3 0000-00-00 00:00:00 0000-00-00 00:00:00
2017 25 Apr 1:2:3 2017-04-01 01:02:03 2017-04-01 01:02:03
2017 Apr 01 11:22:33 2017-04-01 11:22:33 2017-04-01 11:22:33
2017 Apr 02 01/02/03 UTC+0300 ᴺᵁᴸᴸ 0000-00-00 00:00:00
2017 Apr 02 010203 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 01:2:3 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:02:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 11:22:33 2017-04-02 11:22:33 2017-04-02 11:22:33
2017 Apr 02 1:2:03 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:22:33 2017-04-02 01:22:33 2017-04-02 01:22:33
2017 Apr 02 1:2:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:2:33 2017-04-02 01:02:33 2017-04-02 01:02:33
2017 Apr 02 1:2:3 MSK 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 MSK 2017 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 MSK 2018 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 UTC+0000 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Apr 02 1:2:3 UTC+0300 2017-04-01 22:02:03 2017-04-01 22:02:03
2017 Apr 02 1:2:3 UTC+0400 2017-04-01 21:02:03 2017-04-01 21:02:03
2017 Apr 2 1:2:3 2017-04-02 01:02:03 2017-04-02 01:02:03
2017 Jan 02 010203 UTC+0300 2017-01-01 22:02:03 2017-01-01 22:02:03
25 Apr 2017 01:02:03 2017-04-25 01:02:03 2017-04-25 01:02:03
25 Apr 2017 1:2:3 2017-04-25 01:02:03 2017-04-25 01:02:03
25 Jan 2017 1:2:3 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 MSK 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3Z 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 Z 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3 Z +0300 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 Z+03:00 2017-01-24 22:02:03 2017-01-24 22:02:03
25 Jan 2017 1:2:3 Z +0300 OM ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3 Z +03:00 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z +0300 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z+03:00 PM 2017-01-25 10:02:03 2017-01-25 10:02:03
25 Jan 2017 1:2:3 Z +03:30 PM 2017-01-25 09:32:03 2017-01-25 09:32:03
25 Jan 2017 1:2:3Z Mo ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3Z Mon 2017-01-25 01:02:03 2017-01-25 01:02:03
25 Jan 2017 1:2:3Z Moo ᴺᵁᴸᴸ 0000-00-00 00:00:00
25 Jan 2017 1:2:3 Z PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3Z PM 2017-01-25 13:02:03 2017-01-25 13:02:03
25 Jan 2017 1:2:3 Z PM +03:00 2017-01-25 10:02:03 2017-01-25 10:02:03
Jun, 11 Feb 2018 06:40:50 +0300 2000-06-01 00:00:00 2000-06-01 00:00:00
Sun 11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50
Sun, 11 Feb 2018 06:40:50 +0300 2018-02-11 03:40:50 2018-02-11 03:40:50

View File

@ -1,22 +1,22 @@
s a b
s a b
24.12.2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24.12.18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-Dec-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/2018 2018-12-24 00:00:00 2018-12-24 00:00:00
01-OCT-2015 2015-10-01 00:00:00 2015-10-01 00:00:00
24.12.2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24.12.18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-Dec-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/2018 2018-12-24 00:00:00 2018-12-24 00:00:00
01-OCT-2015 2015-10-01 00:00:00 2015-10-01 00:00:00
24.12.18 010203 2018-12-24 01:02:03 2018-12-24 01:02:03
24.12.18 01:02:03 2018-12-24 01:02:03 2018-12-24 01:02:03
24.DEC.18T01:02:03.000+0300 2018-12-23 22:02:03 2018-12-23 22:02:03
01-September-2018 11:22 2018-09-01 11:22:00 2018-09-01 11:22:00
24.12.2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24.12.18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-Dec-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/2018 2018-12-24 00:00:00 2018-12-24 00:00:00
01-OCT-2015 2015-10-01 00:00:00 2015-10-01 00:00:00
24.12.2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-2018 2018-12-24 00:00:00 2018-12-24 00:00:00
24.12.18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-12-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24-Dec-18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/18 2018-12-24 00:00:00 2018-12-24 00:00:00
24/DEC/2018 2018-12-24 00:00:00 2018-12-24 00:00:00
01-OCT-2015 2015-10-01 00:00:00 2015-10-01 00:00:00
24.12.18 010203 2018-12-24 01:02:03 2018-12-24 01:02:03
24.12.18 01:02:03 2018-12-24 01:02:03 2018-12-24 01:02:03
24.DEC.18T01:02:03.000+0300 2018-12-23 22:02:03 2018-12-23 22:02:03
01-September-2018 11:22 2018-09-01 11:22:00 2018-09-01 11:22:00

View File

@ -0,0 +1,114 @@
┏━━━━━━━━┳━━━━━┓
x  ┃ y  ┃
┡━━━━━━━━╇━━━━━┩
│ привет │ мир │
└────────┴─────┘
┏━━━━━━━┳━━━━━┓
x  ┃ y  ┃
┡━━━━━━━╇━━━━━┩
│ приве⋯│ мир │
└───────┴─────┘
┌─x─────┬─y───┐
│ приве⋯│ мир │
└───────┴─────┘
x y
приве⋯ мир
┏━━━━━━━┳━━━━━━━┓
x  ┃ y  ┃
┡━━━━━━━╇━━━━━━━┩
│ приве⋯│ мир │
├───────┼───────┤
│ мир │ приве⋯│
└───────┴───────┘
┌─x─────┬─y─────┐
│ приве⋯│ мир │
│ мир │ приве⋯│
└───────┴───────┘
x y
приве⋯ мир
мир приве⋯
┏━━━━━━━━┳━━━━━┓
x  ┃ y  ┃
┡━━━━━━━━╇━━━━━┩
│ привет │ мир │
└────────┴─────┘
┌─x──────┬─y───┐
│ привет │ мир │
└────────┴─────┘
x y
привет мир
┏━━━━━━━━┳━━━━━━━━┓
x  ┃ y  ┃
┡━━━━━━━━╇━━━━━━━━┩
│ привет │ мир │
├────────┼────────┤
│ мир │ привет │
└────────┴────────┘
┌─x──────┬─y──────┐
│ привет │ мир │
│ мир │ привет │
└────────┴────────┘
x y
привет мир
мир привет
┏━━━┳━━━┓
x ┃ y ┃
┡━━━╇━━━┩
│ п⋯│ м⋯│
└───┴───┘
┌─x─┬─y─┐
│ п⋯│ м⋯│
└───┴───┘
x y
п⋯ м⋯
┏━━━┳━━━┓
x ┃ y ┃
┡━━━╇━━━┩
│ п⋯│ м⋯│
├───┼───┤
│ м⋯│ п⋯│
└───┴───┘
┌─x─┬─y─┐
│ п⋯│ м⋯│
│ м⋯│ п⋯│
└───┴───┘
x y
п⋯ м⋯
м⋯ п⋯
┏━━━┳━━━┓
x ┃ y ┃
┡━━━╇━━━┩
⋯ │ ⋯ │
└───┴───┘
┌─x─┬─y─┐
⋯ │ ⋯ │
└───┴───┘
x y
⋯ ⋯
┏━━━┳━━━┓
x ┃ y ┃
┡━━━╇━━━┩
⋯ │ ⋯ │
├───┼───┤
⋯ │ ⋯ │
└───┴───┘
┌─x─┬─y─┐
⋯ │ ⋯ │
⋯ │ ⋯ │
└───┴───┘
x y
⋯ ⋯
⋯ ⋯
┏━━━┳━━━┓
┃ x ┃ y ┃
┡━━━╇━━━┩
│ ⋯ │ ⋯ │
└───┴───┘

View File

@ -0,0 +1,43 @@
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;
SET output_format_pretty_max_value_width = 5;
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettyCompact;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettySpace;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT Pretty;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettyCompact;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettySpace;
SET output_format_pretty_max_value_width = 6;
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettyCompact;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettySpace;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT Pretty;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettyCompact;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettySpace;
SET output_format_pretty_max_value_width = 1;
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettyCompact;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettySpace;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT Pretty;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettyCompact;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettySpace;
SET output_format_pretty_max_value_width = 0;
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettyCompact;
SELECT 'привет' AS x, 'мир' AS y FORMAT PrettySpace;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT Pretty;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettyCompact;
SELECT * FROM VALUES('x String, y String', ('привет', 'мир'), ('мир', 'привет')) FORMAT PrettySpace;
SET output_format_pretty_color = 0;
SELECT 'привет' AS x, 'мир' AS y FORMAT Pretty;