mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-08-19 20:48:30 +00:00
1acdec9334
* fix: timestamp display precision should respect column schema (#8227) Previously, the MySQL writer converted timestamps to NaiveDateTime via to_chrono_datetime_with_timezone(), then passed the NaiveDateTime to write_col(). NaiveDateTime::Display uses a fixed 6-digit fractional- second format, causing: - TIMESTAMP(3) to show '.195000' instead of '.195' - TIMESTAMP(9) to show '.195123' instead of '.195123456' Fix: use Timestamp::to_timezone_aware_string() directly, which formats with chrono's '%.f' specifier — it strips trailing zeros and preserves full nanosecond fidelity based on the actual stored unit. Also add comprehensive unit tests in mysql_writer_test.rs covering: - All concrete data type → MySQL column type mappings - UNSIGNED_FLAG propagation for unsigned integer types - Timestamp precision for all four units (0/3/6/9 decimal places) - Edge cases: zero subseconds, trailing-zero stripping, Unix epoch, negative timestamps, and timezone offset shifts - Column-def ordering, empty schema, and decimal variants Signed-off-by: Divyansh <anshmcs@gmail.com> * perf: reuse format buffer for timestamp serialization to avoid per-row heap allocation Signed-off-by: Divyansh <anshmcs@gmail.com> * refactor: rename test variable and update visibility of create_mysql_column function Signed-off-by: Divyansh <anshmcs@gmail.com> * test: fix timestamp test constants and add sqlness case for display precision - Correct the base epoch constant: 1_748_836_200 is 2025-06-02, not 2026-06-02; use 1_780_372_200 to match the documented instant. - Fix subsecond expectations: chrono's %.f renders fractional digits in groups of 3 (.100 / .010), it does not strip to .1 / .01. - Add sqlness case timestamp_precision_display reproducing issue #8227 over the MySQL protocol (TIMESTAMP(0/3/6/9) rendering). - cargo fmt reflow of create_mysql_column signature. Signed-off-by: Divyansh <anshmcs@gmail.com> * fix: support binary protocol for timestamp column Signed-off-by: Divyansh <anshmcs@gmail.com> * test: update sqlness results for new timestamp display precision Signed-off-by: Divyansh <anshmcs@gmail.com> --------- Signed-off-by: Divyansh <anshmcs@gmail.com>
42 lines
929 B
Plaintext
42 lines
929 B
Plaintext
-- SQLNESS PROTOCOL MYSQL
|
|
CREATE TABLE integers (
|
|
val INT,
|
|
ts TIMESTAMP,
|
|
TIME INDEX(ts)
|
|
);
|
|
|
|
affected_rows: 0
|
|
|
|
-- SQLNESS PROTOCOL MYSQL
|
|
INSERT INTO integers VALUES (11, 1), (12, 2);
|
|
|
|
affected_rows: 2
|
|
|
|
-- SQLNESS PROTOCOL MYSQL
|
|
INSERT INTO integers VALUES ('13', '3'), ('14', '4');
|
|
|
|
affected_rows: 2
|
|
|
|
-- SQLNESS PROTOCOL MYSQL
|
|
INSERT INTO integers VALUES ('15a', 5), ('16', 6);
|
|
|
|
Failed to execute query, err: MySqlError { ERROR 1210 (HY000): (InvalidArguments): Unable to convert 15a to datatype Int32(Int32Type) }
|
|
|
|
-- SQLNESS PROTOCOL MYSQL
|
|
SELECT * FROM integers ORDER BY ts;
|
|
|
|
+-----+-------------------------+
|
|
| val | ts |
|
|
+-----+-------------------------+
|
|
| 11 | 1970-01-01 00:00:00.001 |
|
|
| 12 | 1970-01-01 00:00:00.002 |
|
|
| 13 | 1970-01-01 00:00:00.003 |
|
|
| 14 | 1970-01-01 00:00:00.004 |
|
|
+-----+-------------------------+
|
|
|
|
-- SQLNESS PROTOCOL MYSQL
|
|
DROP TABLE integers;
|
|
|
|
affected_rows: 0
|
|
|