This is an automated email from the ASF dual-hosted git repository.
Gabriel39 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 7b90b8aed45 [fix](outfile)Preserve DateTimeV2 scale in OUTFILE CSV.
(#64344)
7b90b8aed45 is described below
commit 7b90b8aed458d828b8cf2ccf5aa0b0a488c3c713
Author: daidai <[email protected]>
AuthorDate: Tue Jun 23 09:54:06 2026 +0800
[fix](outfile)Preserve DateTimeV2 scale in OUTFILE CSV. (#64344)
CSV OUTFILE serialization for DateTimeV2 was using the value-level
default formatter, which emits six fractional digits whenever
microseconds are present. The serializer already carries the declared
DateTimeV2 scale, so pass it through and cover the local OUTFILE CSV
path with a focused Groovy regression.
example :
```
table:
CREATE TABLE test_outfile_datetimev2 (
id INT,
dt3 DATETIMEV2(3) ) ...
data :
1 2026-06-06 15:54:51.442
before outfile :
2026-06-06 15:54:51.442000
after outfile:
2026-06-06 15:54:51.442
```
---
.../data_type_serde/data_type_datetimev2_serde.cpp | 2 +-
.../data_type_serde_datetime_v2_test.cpp | 87 ++++++++++++++++
.../data/export_p0/test_export_data_types.out | 25 +++--
.../export_p0/test_outfile_datetimev2_scale.groovy | 110 +++++++++++++++++++++
4 files changed, 210 insertions(+), 14 deletions(-)
diff --git a/be/src/core/data_type_serde/data_type_datetimev2_serde.cpp
b/be/src/core/data_type_serde/data_type_datetimev2_serde.cpp
index deb956714d1..ca84996ea45 100644
--- a/be/src/core/data_type_serde/data_type_datetimev2_serde.cpp
+++ b/be/src/core/data_type_serde/data_type_datetimev2_serde.cpp
@@ -328,7 +328,7 @@ Status
DataTypeDateTimeV2SerDe::serialize_one_cell_to_json(const IColumn& column
auto val = assert_cast<const ColumnDateTimeV2&,
TypeCheckOnRelease::DISABLE>(*ptr).get_element(
row_num);
char buf[64];
- char* pos = val.to_string(buf);
+ char* pos = val.to_string(buf, _scale);
bw.write(buf, pos - buf - 1);
if (_nesting_level > 1) {
diff --git a/be/test/core/data_type_serde/data_type_serde_datetime_v2_test.cpp
b/be/test/core/data_type_serde/data_type_serde_datetime_v2_test.cpp
index 456aa6a54d2..3769e5f6946 100644
--- a/be/test/core/data_type_serde/data_type_serde_datetime_v2_test.cpp
+++ b/be/test/core/data_type_serde/data_type_serde_datetime_v2_test.cpp
@@ -25,7 +25,9 @@
#include <cstddef>
#include <iostream>
#include <limits>
+#include <string>
#include <type_traits>
+#include <vector>
#include "core/assert_cast.h"
#include "core/column/column.h"
@@ -217,6 +219,91 @@ TEST_F(DataTypeDateTimeV2SerDeTest, serdes) {
test_func(*serde_time_v2_0, column_time_v2_0);
}
+TEST_F(DataTypeDateTimeV2SerDeTest, SerializeDateTimeV2KeepsScale) {
+ auto column = ColumnDateTimeV2::create();
+
+ auto insert_datetime = [&](int microsecond) {
+ DateV2Value<DateTimeV2ValueType> value;
+ value.unchecked_set_time(2026, 6, 6, 15, 54, 51, microsecond);
+ column->insert_value(value);
+ };
+ insert_datetime(442123);
+ insert_datetime(442000);
+ insert_datetime(0);
+
+ auto serialize_one = [&](int scale, int64_t row_num, int nesting_level =
1) {
+ DataTypeDateTimeV2SerDe serde(scale, nesting_level);
+ DataTypeSerDe::FormatOptions option;
+ auto ser_col = ColumnString::create();
+ VectorBufferWriter buffer_writer(*ser_col);
+ auto st = serde.serialize_one_cell_to_json(*column, row_num,
buffer_writer, option);
+ EXPECT_TRUE(st.ok()) << "Failed to serialize datetimev2 at row " <<
row_num << ": " << st;
+ buffer_writer.commit();
+ return ser_col->get_data_at(0).to_string();
+ };
+
+ auto default_to_string = [](int microsecond) {
+ DateV2Value<DateTimeV2ValueType> value;
+ value.unchecked_set_time(2026, 6, 6, 15, 54, 51, microsecond);
+ char buf[64];
+ value.to_string(buf);
+ return std::string(buf);
+ };
+
+ auto scaled_to_string = [](int microsecond, int scale) {
+ DateV2Value<DateTimeV2ValueType> value;
+ value.unchecked_set_time(2026, 6, 6, 15, 54, 51, microsecond);
+ char buf[64];
+ value.to_string(buf, scale);
+ return std::string(buf);
+ };
+
+ EXPECT_EQ("2026-06-06 15:54:51.120000", default_to_string(120000));
+ EXPECT_EQ("2026-06-06 15:54:51", default_to_string(0));
+ EXPECT_EQ("2026-06-06 15:54:51.120", scaled_to_string(120000, 3));
+ EXPECT_EQ("2026-06-06 15:54:51.000", scaled_to_string(0, 3));
+
+ struct SerializeCase {
+ int scale;
+ const char* full_microsecond;
+ const char* millisecond;
+ const char* zero_microsecond;
+ };
+ const std::vector<SerializeCase> cases = {
+ {0, "2026-06-06 15:54:51", "2026-06-06 15:54:51", "2026-06-06
15:54:51"},
+ {1, "2026-06-06 15:54:51.4", "2026-06-06 15:54:51.4", "2026-06-06
15:54:51.0"},
+ {2, "2026-06-06 15:54:51.44", "2026-06-06 15:54:51.44",
"2026-06-06 15:54:51.00"},
+ {3, "2026-06-06 15:54:51.442", "2026-06-06 15:54:51.442",
"2026-06-06 15:54:51.000"},
+ {4, "2026-06-06 15:54:51.4421", "2026-06-06 15:54:51.4420",
"2026-06-06 15:54:51.0000"},
+ {5, "2026-06-06 15:54:51.44212", "2026-06-06 15:54:51.44200",
+ "2026-06-06 15:54:51.00000"},
+ {6, "2026-06-06 15:54:51.442123", "2026-06-06 15:54:51.442000",
+ "2026-06-06 15:54:51.000000"},
+ };
+
+ for (const auto& c : cases) {
+ EXPECT_EQ(c.full_microsecond, serialize_one(c.scale, 0)) << "scale="
<< c.scale;
+ EXPECT_EQ(c.millisecond, serialize_one(c.scale, 1)) << "scale=" <<
c.scale;
+ EXPECT_EQ(c.zero_microsecond, serialize_one(c.scale, 2)) << "scale="
<< c.scale;
+ }
+
+ EXPECT_EQ("\"2026-06-06 15:54:51.442\"", serialize_one(3, 1, 2));
+
+ DataTypeDateTimeV2SerDe serde(3);
+ DataTypeSerDe::FormatOptions option;
+ option.field_delim = "|";
+ auto ser_col = ColumnString::create();
+ VectorBufferWriter buffer_writer(*ser_col);
+ auto st = serde.serialize_column_to_json(*column, 0, column->size(),
buffer_writer, option);
+ EXPECT_TRUE(st.ok()) << "Failed to serialize datetimev2 column: " << st;
+ buffer_writer.commit();
+ std::string serialized((char*)ser_col->get_chars().data(),
ser_col->get_chars().size());
+ EXPECT_EQ(
+ "2026-06-06 15:54:51.442|2026-06-06 15:54:51.442|"
+ "2026-06-06 15:54:51.000",
+ serialized);
+}
+
// Run with UBSan enabled to catch misalignment errors.
TEST_F(DataTypeDateTimeV2SerDeTest, ArrowMemNotAlignedDate) {
// 1.Prepare the data.
diff --git a/regression-test/data/export_p0/test_export_data_types.out
b/regression-test/data/export_p0/test_export_data_types.out
index f02acd6a3b1..82cae66256e 100644
--- a/regression-test/data/export_p0/test_export_data_types.out
+++ b/regression-test/data/export_p0/test_export_data_types.out
@@ -6,10 +6,10 @@
4 0000-01-01 0000-01-01 2023-04-20T00:00
2023-04-20T00:00 2023-04-20T00:00 2023-04-20T00:00 Beijing
Haidian 4 4 true 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
-- !select_load1 --
-1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 1
1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
-2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120000 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
-3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123000 2023-04-20 00:00:00.123456
Beijing 32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff: [...]
-4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 4
4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
+1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 1 1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
+2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
+3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123 2023-04-20 00:00:00.123456 Beijing
32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff:fff [...]
+4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 4 4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
-- !select_load2 --
1 2023-04-20 2023-04-20 2023-04-20T00:00
2023-04-20T00:00 2023-04-20T00:00 2023-04-20T00:00 Beijing
Haidian 1 1 true 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 1 ::1
@@ -24,14 +24,13 @@
4 0000-01-01 0000-01-01 2023-04-20T00:00
2023-04-20T00:00 2023-04-20T00:00 2023-04-20T00:00 Beijing
Haidian 4 4 true 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 4 ::4
-- !select_load4 --
-1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 1
1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
-2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120000 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
-3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123000 2023-04-20 00:00:00.123456
Beijing 32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff: [...]
-4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 4
4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
+1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 1 1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
+2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
+3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123 2023-04-20 00:00:00.123456 Beijing
32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff:fff [...]
+4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 4 4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
-- !select_load5 --
-1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 1
1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
-2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120000 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
-3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123000 2023-04-20 00:00:00.123456
Beijing 32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff: [...]
-4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00 2023-04-20 00:00:00 Beijing Haidian 4
4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
-
+1 2023-04-20 2023-04-20 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 1 1 1 1 1 1 1.1 1.1 char1
1.000000000 1.000000000 1 0.1 1.00000000 1.0000000000
1 1.0000000000000000000000000000000000000
0.10000000000000000000000000000000000000 0.0.0.1 ::1
+2 9999-12-31 9999-12-31 9999-12-31 23:59:59 9999-12-31
23:59:59 2023-04-20 00:00:00.120 2023-04-20 00:00:00.334400
Haidian -32768 -128 1 -2147483648 -9223372036854775808
-170141183460469231731687303715884105728 1.401298e-45
4.940656458412465e-324 char2 100000000.000000000 100000000.000000000
4 0.1 0.99999999 9999999999.9999999999
99999999999999999999999999999999999999 9.9999999999999999999999999999999999999
0.99999999999999999999999999999999999999 0.0.0.0 ::
+3 2023-04-21 2023-04-21 2023-04-20 12:34:56 2023-04-20
00:00:00 2023-04-20 00:00:00.123 2023-04-20 00:00:00.123456 Beijing
32767 127 1 2147483647 9223372036854775807
170141183460469231731687303715884105727 3.402823e+38 1.797693134862316e+308
char3 999999999.000000000 999999999.000000000 9 0.9
9.99999999 1234567890.0123456789 12345678901234567890123456789012345678
1.2345678901234567890123456789012345678
0.12345678901234567890123456789012345678 255.255.255.255
ffff:ffff:ffff:ffff:ffff:fff [...]
+4 0000-01-01 0000-01-01 2023-04-20 00:00:00 2023-04-20
00:00:00 2023-04-20 00:00:00.000 2023-04-20 00:00:00.000000 Beijing
Haidian 4 4 1 4 4 4 4.4 4.4 char4
4.000000000 4.000000000 4 0.4 4.00000000 4.0000000000
4 4.0000000000000000000000000000000000000
0.40000000000000000000000000000000000000 0.0.0.4 ::4
diff --git
a/regression-test/suites/export_p0/test_outfile_datetimev2_scale.groovy
b/regression-test/suites/export_p0/test_outfile_datetimev2_scale.groovy
new file mode 100644
index 00000000000..dc3d8dfafb1
--- /dev/null
+++ b/regression-test/suites/export_p0/test_outfile_datetimev2_scale.groovy
@@ -0,0 +1,110 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.nio.file.Paths
+
+suite("test_outfile_datetimev2_scale") {
+ StringBuilder strBuilder = new StringBuilder()
+ strBuilder.append("curl --location-trusted -u " + context.config.jdbcUser
+ ":" + context.config.jdbcPassword)
+ if
((context.config.otherConfigs.get("enableTLS")?.toString()?.equalsIgnoreCase("true"))
?: false) {
+ strBuilder.append(" https://" + context.config.feHttpAddress +
"/rest/v1/config/fe")
+ strBuilder.append(" --cert " +
context.config.otherConfigs.get("trustCert") + " --cacert " +
context.config.otherConfigs.get("trustCACert") + " --key " +
context.config.otherConfigs.get("trustCAKey"))
+ } else {
+ strBuilder.append(" http://" + context.config.feHttpAddress +
"/rest/v1/config/fe")
+ }
+
+ String command = strBuilder.toString()
+ def process = command.execute()
+ def code = process.waitFor()
+ def err = IOGroovyMethods.getText(new BufferedReader(new
InputStreamReader(process.getErrorStream())))
+ def out = process.getText()
+ logger.info("Request FE Config: code=" + code + ", out=" + out + ", err="
+ err)
+ assertEquals(code, 0)
+ def response = parseJson(out.trim())
+ assertEquals(response.code, 0)
+ assertEquals(response.msg, "success")
+ def configJson = response.data.rows
+ boolean enableOutfileToLocal = false
+ for (Object conf: configJson) {
+ assert conf instanceof Map
+ if (((Map<String, String>) conf).get("Name").toLowerCase() ==
"enable_outfile_to_local") {
+ enableOutfileToLocal = ((Map<String, String>)
conf).get("Value").toLowerCase() == "true"
+ }
+ }
+ if (!enableOutfileToLocal) {
+ logger.warn("Please set enable_outfile_to_local to true to run
test_outfile_datetimev2_scale")
+ return
+ }
+
+ def tableName = "test_outfile_datetimev2_scale"
+ def uuid = UUID.randomUUID().toString()
+ def outFilePath = """/tmp/test_outfile_datetimev2_scale_${uuid}"""
+
+ try {
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE ${tableName} (
+ `id` INT,
+ `dt0` DATETIMEV2(0),
+ `dt3` DATETIMEV2(3),
+ `dt6` DATETIMEV2(6)
+ )
+ DUPLICATE KEY(`id`)
+ DISTRIBUTED BY HASH(`id`) BUCKETS 1
+ PROPERTIES("replication_num" = "1");
+ """
+ sql """
+ INSERT INTO ${tableName} VALUES
+ (1, '2026-06-06 15:54:51', '2026-06-06 15:54:51.442', '2026-06-06
15:54:51.442000');
+ """
+
+ File path = new File(outFilePath)
+ if (!path.exists()) {
+ assert path.mkdirs()
+ } else {
+ throw new IllegalStateException("""${outFilePath} already exists!
""")
+ }
+
+ sql """
+ SELECT * FROM ${tableName} ORDER BY id
+ INTO OUTFILE "file://${outFilePath}/"
+ FORMAT AS CSV
+ PROPERTIES("column_separator" = ",");
+ """
+
+ File[] files = path.listFiles().findAll { it.isFile() &&
it.getName().endsWith(".csv") } as File[]
+ assertEquals(1, files.length)
+
+ List<String> outLines =
Files.readAllLines(Paths.get(files[0].getAbsolutePath()),
StandardCharsets.UTF_8)
+ assertEquals(1, outLines.size())
+ assertEquals("1,2026-06-06 15:54:51,2026-06-06 15:54:51.442,2026-06-06
15:54:51.442000", outLines.get(0))
+ assertFalse(outLines.get(0).contains("2026-06-06
15:54:51.442000,2026-06-06 15:54:51.442000"))
+ } finally {
+ try_sql("DROP TABLE IF EXISTS ${tableName}")
+ File path = new File(outFilePath)
+ if (path.exists()) {
+ for (File f: path.listFiles()) {
+ f.delete()
+ }
+ path.delete()
+ }
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]