From 87c3953c9af79c86430d1fa15acca6516470d698 Mon Sep 17 00:00:00 2001 From: Alex Bell Date: Thu, 16 Jun 2016 16:44:07 -0400 Subject: [PATCH 1/6] feat: Implements JSON typecasting changes: * adds JSON to typecasting switch in `RowDataPacket.js` * adds typecasting test case for JSON in `test-type-casting.js` --- lib/protocol/packets/RowDataPacket.js | 2 ++ test/integration/connection/test-type-casting.js | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/protocol/packets/RowDataPacket.js b/lib/protocol/packets/RowDataPacket.js index 6bf50bd0e..07b1f269b 100644 --- a/lib/protocol/packets/RowDataPacket.js +++ b/lib/protocol/packets/RowDataPacket.js @@ -116,6 +116,8 @@ function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, : parser.parseLengthCodedString(); case Types.GEOMETRY: return parser.parseGeometryValue(); + case Types.JSON: + return JSON.parse(parser.parseLengthCodedString()); default: return parser.parseLengthCodedString(); } diff --git a/test/integration/connection/test-type-casting.js b/test/integration/connection/test-type-casting.js index 4e04318f3..6caaf5b3c 100644 --- a/test/integration/connection/test-type-casting.js +++ b/test/integration/connection/test-type-casting.js @@ -53,7 +53,8 @@ var tests = [ {type: 'multipoint', insertRaw: "GeomFromText('MULTIPOINT(0 0, 20 20, 60 60)')", expect: [{x:0, y:0}, {x:20, y:20}, {x:60, y:60}], deep: true}, {type: 'multilinestring', insertRaw: "GeomFromText('MULTILINESTRING((10 10, 20 20), (15 15, 30 15))')", expect: [[{x:10,y:10},{x:20,y:20}],[{x:15,y:15},{x:30,y:15}]], deep: true}, {type: 'multipolygon', insertRaw: "GeomFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))')", expect: [[[{x:0,y:0},{x:10,y:0},{x:10,y:10},{x:0,y:10},{x:0,y:0}]],[[{x:5,y:5},{x:7,y:5},{x:7,y:7},{x:5,y:7},{x:5,y:5}]]], deep: true}, - {type: 'geometrycollection', insertRaw: "GeomFromText('GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))')", expect: [{x:10,y:10},{x:30,y:30},[{x:15,y:15},{x:20,y:20}]], deep: true} + {type: 'geometrycollection', insertRaw: "GeomFromText('GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))')", expect: [{x:10,y:10},{x:30,y:30},[{x:15,y:15},{x:20,y:20}]], deep: true}, + {type: 'json', insert: { name: "mysql", data: [{ id: 5}, { id: 6}]}} ]; var table = 'type_casting'; From 4015790b284f4333ce26c6943b761b0800154774 Mon Sep 17 00:00:00 2001 From: Diogo Resende Date: Fri, 4 Nov 2016 21:23:32 +0000 Subject: [PATCH 2/6] tests: adds mysql.format() coverage --- test/integration/connection/test-format.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 test/integration/connection/test-format.js diff --git a/test/integration/connection/test-format.js b/test/integration/connection/test-format.js new file mode 100644 index 000000000..27ae171a7 --- /dev/null +++ b/test/integration/connection/test-format.js @@ -0,0 +1,14 @@ +var path = require('path'); +var assert = require('assert'); +var common = require('../../common'); +var lib = require(path.resolve(common.lib, '../index')); + +assert.equal( + lib.format('SELECT * FROM ?? WHERE ?? = ?', [ 'table', 'property', 123 ]), + 'SELECT * FROM `table` WHERE `property` = 123' +); + +assert.equal( + lib.format('INSERT INTO ?? SET ?', [ 'table', { property: 123 } ]), + 'INSERT INTO `table` SET `property` = 123' +); From dce49bdd92d3195e9da4c2369da60b562ac50c97 Mon Sep 17 00:00:00 2001 From: Diogo Resende Date: Fri, 4 Nov 2016 21:31:52 +0000 Subject: [PATCH 3/6] tests: adds mysql.Types coverage --- test/integration/connection/test-types.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 test/integration/connection/test-types.js diff --git a/test/integration/connection/test-types.js b/test/integration/connection/test-types.js new file mode 100644 index 000000000..a9d97a7ab --- /dev/null +++ b/test/integration/connection/test-types.js @@ -0,0 +1,11 @@ +var path = require('path'); +var assert = require('assert'); +var common = require('../../common'); +var lib = require(path.resolve(common.lib, '../index')); +var types = require(path.resolve(common.lib, 'protocol/constants/types')); + +assert.equal(typeof lib.Types, "object"); + +for (var k in types) { + assert.equal(lib.Types[k], types[k]); +} From 77a23c1ed6c387d6a1ab68ca75854757c567876e Mon Sep 17 00:00:00 2001 From: Diogo Resende Date: Fri, 4 Nov 2016 22:10:36 +0000 Subject: [PATCH 4/6] tests: adds change user charset coverage --- .../connection/test-change-user-charset.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 test/integration/connection/test-change-user-charset.js diff --git a/test/integration/connection/test-change-user-charset.js b/test/integration/connection/test-change-user-charset.js new file mode 100644 index 000000000..9e3e0219f --- /dev/null +++ b/test/integration/connection/test-change-user-charset.js @@ -0,0 +1,18 @@ +var assert = require('assert'); +var common = require('../../common'); + +common.getTestConnection(function (err, connection) { + assert.ifError(err); + + // should change charset + connection.changeUser({charset:'KOI8R_GENERAL_CI'}, function (err) { + assert.ifError(err); + + connection.query('SHOW VARIABLES LIKE \'character_set_client\'', function (err, result) { + assert.ifError(err); + assert.strictEqual(result[0]['Value'], 'koi8r'); + + connection.destroy(); + }); + }); +}); From c97737ae478aec1f0cfcaf3b486a1d26805f3c23 Mon Sep 17 00:00:00 2001 From: Diogo Resende Date: Fri, 4 Nov 2016 22:11:03 +0000 Subject: [PATCH 5/6] tests: adds another way of making a simple query with object params --- test/integration/connection/test-query.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/integration/connection/test-query.js b/test/integration/connection/test-query.js index 42ddba4d7..2d5aa4cd7 100644 --- a/test/integration/connection/test-query.js +++ b/test/integration/connection/test-query.js @@ -8,6 +8,13 @@ common.getTestConnection(function (err, connection) { assert.ifError(err); assert.deepEqual(rows, [{1: 1}]); assert.equal(fields[0].name, '1'); - connection.end(assert.ifError); + + // this is a coverage test, it shuold perform exactly as the previous one + connection.query({ sql: 'SELECT ?' }, [ 1 ], function (err, rows, fields) { + assert.ifError(err); + assert.deepEqual(rows, [{1: 1}]); + assert.equal(fields[0].name, '1'); + connection.end(assert.ifError); + }); }); }); From 7aa6da6f5928ebedb5a75c9c6c2ddd4ded2d00cd Mon Sep 17 00:00:00 2001 From: Diogo Resende Date: Fri, 4 Nov 2016 22:11:34 +0000 Subject: [PATCH 6/6] tests: updates change user test to cover calling without specifing new user --- test/unit/connection/test-change-user.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/unit/connection/test-change-user.js b/test/unit/connection/test-change-user.js index fb38fe8bc..dfe59c78a 100644 --- a/test/unit/connection/test-change-user.js +++ b/test/unit/connection/test-change-user.js @@ -21,8 +21,18 @@ server.listen(common.fakeServerPort, function(err) { assert.ifError(err); assert.strictEqual(result[0]['CURRENT_USER()'], 'user_2@localhost'); - connection.destroy(); - server.destroy(); + // should keep current user + connection.changeUser(function (err) { + assert.ifError(err); + + connection.query('SELECT CURRENT_USER()', function (err, result) { + assert.ifError(err); + assert.strictEqual(result[0]['CURRENT_USER()'], 'user_2@localhost'); + + connection.destroy(); + server.destroy(); + }); + }); }); }); });