Skip to content

Commit 8dc27c5

Browse files
authored
Merge pull request #660 from vasyas/master
Milliseconds for setting date values
2 parents b098d49 + 613d63d commit 8dc27c5

File tree

5 files changed

+55
-11
lines changed

5 files changed

+55
-11
lines changed

lib/compile_binary_parser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ function readCodeFor(field, config, options, fieldNum) {
136136
case Types.TIMESTAMP:
137137
case Types.NEWDATE:
138138
if (config.dateStrings) {
139-
return 'packet.readDateTimeString();';
139+
return 'packet.readDateTimeString(' + field.decimals + ');';
140140
}
141141
return 'packet.readDateTime();';
142142
case Types.TIME:

lib/packets/execute.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ function Execute(id, parameters, charsetNumber) {
1111
this.encoding = CharsetToEncoding[charsetNumber];
1212
}
1313

14+
var pad = '000000000000';
15+
function leftPad(num, value) {
16+
var s = value.toString();
17+
// if we don't need to pad
18+
if (s.length >= num) {
19+
return s;
20+
}
21+
return (pad + s).slice(-num);
22+
}
23+
1424
Execute.prototype.toPacket = function() {
1525
// TODO: don't try to calculate packet length in advance, allocate some big buffer in advance (header + 256 bytes?)
1626
// and copy + reallocate if not enough
@@ -36,7 +46,9 @@ Execute.prototype.toPacket = function() {
3646
this.parameters[i] =
3747
[d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-') +
3848
' ' +
39-
[d.getHours(), d.getMinutes(), d.getSeconds()].join(':');
49+
[d.getHours(), d.getMinutes(), d.getSeconds()].join(':') +
50+
'.' + leftPad(3, d.getMilliseconds())
51+
;
4052
}
4153
if (Buffer.isBuffer(this.parameters[i])) {
4254
length += Packet.lengthCodedNumberLength(this.parameters[i].length);

lib/packets/packet.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ function leftPad(num, value) {
273273
return (pad + s).slice(-num);
274274
}
275275

276-
Packet.prototype.readDateTimeString = function() {
276+
Packet.prototype.readDateTimeString = function(decimals) {
277277
var length = this.readInt8();
278278
var y = 0;
279279
var m = 0;
@@ -298,6 +298,15 @@ Packet.prototype.readDateTimeString = function() {
298298
if (length > 10) {
299299
ms = this.readInt32();
300300
str += '.';
301+
302+
if (decimals) {
303+
ms = leftPad(6, ms);
304+
305+
if (ms.length > decimals) {
306+
ms = ms.substring(0, decimals); // rounding is done at the MySQL side, only 0 are here
307+
}
308+
}
309+
301310
str += ms;
302311
}
303312
return str;

test/integration/connection/test-datetime.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,41 @@ var connection = common.createConnection();
33
var connection1 = common.createConnection({ dateStrings: true });
44
var assert = require('assert');
55

6-
var rows, rows1, rows2, rows3, rows4, rows5;
6+
var rows, rows1, rows2, rows3, rows4, rows5, rows6;
77

88
var date = new Date('1990-01-01 08:15:11 UTC');
9+
var datetime = new Date('2010-12-10 14:12:09.019473');
10+
911
var date1 = new Date('2000-03-03 08:15:11 UTC');
1012
var date2 = '2010-12-10 14:12:09.019473';
1113
var date3 = null;
14+
var date4 = '2010-12-10 14:12:09.123456';
15+
var date5 = '2010-12-10 14:12:09.019';
1216

13-
connection.query('CREATE TEMPORARY TABLE t (d1 DATE)');
17+
connection.query('CREATE TEMPORARY TABLE t (d1 DATE, d2 DATETIME(3), d3 DATETIME(6))');
1418
connection.query("set time_zone = '+00:00'");
15-
connection.query('INSERT INTO t set d1=?', [date]);
19+
connection.query('INSERT INTO t set d1=?, d2=?, d3=?', [ date, datetime, datetime ]);
1620

1721
connection1.query(
18-
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME)'
22+
'CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME, d4 DATETIME, d5 DATETIME(6), d6 DATETIME(3))'
1923
);
20-
connection1.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?', [
24+
connection1.query('INSERT INTO t set d1=?, d2=?, d3=?, d4=?, d5=?, d6=?', [
2125
date,
2226
date1,
2327
date2,
24-
date3
28+
date3,
29+
date4,
30+
date5
2531
]);
2632

2733
var dateAsStringExpected = [
2834
{
2935
d1: '1990-01-01',
3036
d2: '2000-03-03 08:15:11',
3137
d3: '2010-12-10 14:12:09',
32-
d4: null
38+
d4: null,
39+
d5: '2010-12-10 14:12:09.123456',
40+
d6: '2010-12-10 14:12:09.019'
3341
}
3442
];
3543

@@ -77,11 +85,19 @@ connection1.query('select * from t', function(err, _rows, _fields) {
7785
rows4 = _rows;
7886
});
7987

88+
8089
connection1.execute('select * from t', function(err, _rows, _fields) {
8190
if (err) {
8291
throw err;
8392
}
8493
rows5 = _rows;
94+
});
95+
96+
connection1.execute('select * from t where d6 = ?', [ new Date(date5) ], function(err, _rows, _fields) {
97+
if (err) {
98+
throw err;
99+
}
100+
rows6 = _rows;
85101
connection1.end();
86102
});
87103

@@ -99,8 +115,15 @@ process.on('exit', function() {
99115
);
100116

101117
assert.equal(rows2[0].d1.getDate(), date.getDate());
118+
assert.equal(rows2[0].d2.getTime(), datetime.getTime());
119+
assert.equal(rows2[0].d3.getTime(), datetime.getTime());
120+
102121
assert.equal(rows3[0].d1.getDate(), date.getDate());
122+
assert.equal(rows3[0].d2.getTime(), datetime.getTime());
123+
assert.equal(rows3[0].d3.getTime(), datetime.getTime());
103124

104125
assert.deepEqual(rows4, dateAsStringExpected);
105126
assert.deepEqual(rows5, dateAsStringExpected);
127+
128+
assert.equal(rows6.length, 1);
106129
});

test/integration/regressions/test-#617.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var expected = [
1616
},
1717
{
1818
id: 2,
19-
date: '2017-07-26 09:36:42.123000',
19+
date: '2017-07-26 09:36:42.123',
2020
name: 'Jane'
2121
}
2222
];

0 commit comments

Comments
 (0)