Skip to content

Commit 13f7288

Browse files
committed
fix #1040 datetime fields returned without time part when time is 00:00:00
1 parent 30a278b commit 13f7288

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

lib/packets/packet.js

+7-5
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

+2-2
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

+6-2
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,7 +73,7 @@ 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)',
7677
);
7778
connection1.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
7879
date,
@@ -81,10 +82,11 @@ connection1.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
8182
date3,
8283
date4,
8384
date5,
85+
date6,
8486
]);
8587

8688
connection2.query(
87-
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3))',
89+
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3), d7 DATETIME)',
8890
);
8991
connection2.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
9092
date,
@@ -93,6 +95,7 @@ connection2.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
9395
date3,
9496
date4,
9597
date5,
98+
date6
9699
]);
97100

98101
connectionZ.query(
@@ -123,6 +126,7 @@ const dateAsStringExpected = [
123126
d4: date3,
124127
d5: date4,
125128
d6: date5,
129+
d7: date6
126130
},
127131
];
128132

0 commit comments

Comments
 (0)