Skip to content

Commit bded498

Browse files
authored
fix #1040 datetime fields returned without time part when time is 00:00:00 (#3204)
1 parent d5a76e6 commit bded498

File tree

3 files changed

+21
-25
lines changed

3 files changed

+21
-25
lines changed

lib/packets/packet.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const ErrorCodeToName = require('../constants/errors.js');
99
const NativeBuffer = require('buffer').Buffer;
1010
const Long = require('long');
1111
const StringParser = require('../parsers/string.js');
12-
12+
const Types = require('../constants/types.js');
1313
const INVALID_DATE = new Date(NaN);
1414

1515
// this is nearly duplicate of previous function so generated code is not slower
@@ -292,14 +292,14 @@ class Packet {
292292
}
293293
return new Date(y, m - 1, d, H, M, S, ms);
294294
}
295-
let str = this.readDateTimeString(6, 'T');
295+
let str = this.readDateTimeString(6, 'T', null);
296296
if (str.length === 10) {
297297
str += 'T00:00:00';
298298
}
299299
return new Date(str + timezone);
300300
}
301301

302-
readDateTimeString(decimals, timeSep) {
302+
readDateTimeString(decimals, timeSep, columnType) {
303303
const length = this.readInt8();
304304
let y = 0;
305305
let m = 0;
@@ -324,6 +324,8 @@ class Packet {
324324
leftPad(2, M),
325325
leftPad(2, S)
326326
].join(':')}`;
327+
} else if (columnType === Types.DATETIME) {
328+
str += ' 00:00:00';
327329
}
328330
if (length > 10) {
329331
ms = this.readInt32();
@@ -425,7 +427,7 @@ class Packet {
425427
return StringParser.decode(
426428
this.buffer,
427429
encoding,
428-
this.offset - len,
430+
this.offset - len,
429431
this.offset
430432
);
431433
}
@@ -915,7 +917,7 @@ class Packet {
915917
}
916918

917919
static MockBuffer() {
918-
const noop = function () {};
920+
const noop = function () { };
919921
const res = Buffer.alloc(0);
920922
for (const op in NativeBuffer.prototype) {
921923
if (typeof res[op] === 'function') {

lib/parsers/binary_parser.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function readCodeFor(field, config, options, fieldNum) {
4242
case Types.TIMESTAMP:
4343
case Types.NEWDATE:
4444
if (helpers.typeMatch(field.columnType, dateStrings, Types)) {
45-
return `packet.readDateTimeString(${parseInt(field.decimals, 10)});`;
45+
return `packet.readDateTimeString(${parseInt(field.decimals, 10)}, ${null}, ${field.columnType});`;
4646
}
4747
return `packet.readDateTime(${helpers.srcEscape(timezone)});`;
4848
case Types.TIME:
@@ -56,7 +56,7 @@ function readCodeFor(field, config, options, fieldNum) {
5656
case Types.GEOMETRY:
5757
return 'packet.parseGeometryValue();';
5858
case Types.VECTOR:
59-
return 'packet.parseVector()';
59+
return 'packet.parseVector()';
6060
case Types.JSON:
6161
// Since for JSON columns mysql always returns charset 63 (BINARY),
6262
// we have to handle it according to JSON specs and use "utf8",

test/integration/connection/test-datetime.test.cjs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const date2 = '2010-12-10 14:12:09.019473';
3232
const date3 = null;
3333
const date4 = '2010-12-10 14:12:09.123456';
3434
const date5 = '2010-12-10 14:12:09.019';
35+
const date6 = '2024-11-10 00:00:00';
3536

3637
function adjustTZ(d, offset) {
3738
if (offset === undefined) {
@@ -72,28 +73,20 @@ connection.query('INSERT INTO t set d1=?, d2=?, d3=?', [
7273
]);
7374

7475
connection1.query(
75-
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3))',
76+
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3), d7 DATETIME)',
77+
);
78+
connection1.query(
79+
'INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?, d7=?',
80+
[date, date1, date2, date3, date4, date5, date6],
7681
);
77-
connection1.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
78-
date,
79-
date1,
80-
date2,
81-
date3,
82-
date4,
83-
date5,
84-
]);
8582

8683
connection2.query(
87-
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3))',
84+
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3), d7 DATETIME)',
85+
);
86+
connection2.query(
87+
'INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?, d7=?',
88+
[date, date1, date2, date3, date4, date5, date6],
8889
);
89-
connection2.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
90-
date,
91-
date1,
92-
date2,
93-
date3,
94-
date4,
95-
date5,
96-
]);
9790

9891
connectionZ.query(
9992
'CREATE TEMPORARY TABLE t (d1 DATE, d2 DATETIME(3), d3 DATETIME(6))',
@@ -123,6 +116,7 @@ const dateAsStringExpected = [
123116
d4: date3,
124117
d5: date4,
125118
d6: date5,
119+
d7: date6,
126120
},
127121
];
128122

0 commit comments

Comments
 (0)