From d776b80118d1b90d95834500b929f1be4fdf7965 Mon Sep 17 00:00:00 2001 From: testn Date: Fri, 15 Oct 2021 10:57:24 +0700 Subject: [PATCH 1/7] Add vscode to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index faceafe6ab..4c10714aac 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ lib-cov *.gz .DS_Store .idea/ +.vscode/ .npmrc mysqldata/ From 7ac7e25cd68b0d1b297c251f2eb89247973006af Mon Sep 17 00:00:00 2001 From: testn Date: Fri, 15 Oct 2021 11:42:38 +0700 Subject: [PATCH 2/7] Fix benchmark to call benchmark.js instead --- benchmarks/run-unit.js | 143 ----------------------------------------- package.json | 2 +- 2 files changed, 1 insertion(+), 144 deletions(-) delete mode 100755 benchmarks/run-unit.js diff --git a/benchmarks/run-unit.js b/benchmarks/run-unit.js deleted file mode 100755 index 19c9f0b831..0000000000 --- a/benchmarks/run-unit.js +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -const progress = require('progress'); - -const fs = require('fs'); -const nWarmup = 2; -const nRepeats = 32 + nWarmup; -const path = require('path'); - -const prevResults = {}; -try { - const r = require('./results.json'); - r.forEach(rr => { - prevResults[rr.path] = rr; - }); -} catch (e) { - // no prev results? -} - -function stats(times) { - let avg = 0; - for (let i = 0; i < times.length; ++i) { - avg += times[i] / times.length; - } - let v = 0; - for (let i = 0; i < times.length; ++i) { - v += ((times[i] - avg) * (times[i] - avg)) / times.length; - } - const stdev = Math.sqrt(v); - return { - avg: avg, - stdev: stdev, - stdevrel: stdev / avg - }; -} - -function runFolder(name, done) { - fs.readdir(name, (err, list) => { - if (err) return done(err); - // eslint-disable-next-line no-use-before-define - runFileList(name, list, done); - }); -} - -function benchmarkModule(m, modulePath, done) { - const results = []; - const bar = new progress(`${m.comment} [:bar] `, { - total: nRepeats, - clear: true - }); - function repeat(w, n) { - bar.tick(); - if (n === 0) { - const result = {}; - const s = stats(results); - const unsDigits = Math.floor(Math.floor(s.stdev).toString().length * 0.8); - let pow = Math.pow(10, unsDigits); - const avg = Math.round(s.avg / pow) * pow; - const uns = Math.round(s.stdev / pow) * pow; - console.log('%s: %s ±%s', m.comment, avg, uns); - result.time = s.avg; - result.timeStdev = s.stdev; - result.comment = m.comment; - result.path = path.relative(__dirname, modulePath); - if (m.toSpeed) { - const speed = m.toSpeed(s.avg, s.stdev); - const speedDigits = Math.floor( - Math.floor(speed.error).toString().length * 0.8 - ); - pow = Math.pow(10, speedDigits); - console.log( - ' = %s ±%s %s', - Math.round(speed.value / pow) * pow, - Math.round(speed.error / pow) * pow, - speed.units - ); - const prev = prevResults[result.path]; - if (prev) { - if (speed.value > prev.speed.value + prev.speed.error) { - console.log( - 'Faster then prev result: %s ±%s %s', - prev.speed.value, - prev.speed.units - ); - } else if (speed.value < prev.speed.value - prev.speed.error) { - console.log( - 'Slower then prev result: %s ±%s %s', - prev.speed.value, - prev.speed.units - ); - } - } - result.speed = speed; - } - return done(null, result); - } - const start = process.hrtime(); - setImmediate(() => { - m(() => { - const end = process.hrtime(start); - if (w <= 0) results.push(end[0] * 1e9 + end[1]); - repeat(w - 1, n - 1); - }); - }); - } - repeat(nWarmup - 1, nRepeats - 1, done); -} - -function runFileList(base, list, done) { - let index = -1; - let results; - function runOne(err, res) { - if (err) return done(err); - ++index; - if (res) { - if (!results) results = []; - if (Array.isArray(res)) results = results.concat(res); - else results.push(res); - } - if (index >= list.length) { - return done(null, results); - } - const fname = `${base}/${list[index]}`; - fs.stat(fname, (err, stat) => { - if (err) return done(err); - if (stat.isDirectory()) return runFolder(fname, runOne); - if (fname.endsWith('.js')) { - const m = require(fname); - return benchmarkModule(m, fname, runOne); - } - runOne(); - }); - } - runOne(); -} - -//const name = process.argv[2] || __dirname + '/unit'; -runFolder(`${__dirname}/unit`, (err, results) => { - //console.log(results); - fs.writeFileSync(`${__dirname}/results.json`, JSON.stringify(results)); -}); diff --git a/package.json b/package.json index d9080d874b..bccf88b410 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint:code": "eslint index.js promise.js \"lib/**/*.js\" \"test/**/*.js\" \"benchmarks/**/*.js\"", "lint:docs": "eslint Contributing.md \"documentation/**/*.md\" \"examples/*.js\"", "test": "node ./test/run.js", - "benchmark": "./benchmarks/run-unit.js", + "benchmark": "node ./benchmarks/benchmark.js", "prettier": "prettier --single-quote --trailing-comma none --write \"{lib,examples,test}/**/*.js\"", "prettier:docs": "prettier --single-quote --trailing-comma none --write README.md documentation/*", "precommit": "lint-staged", From 4f7b551423dee0a5c5a899ad31cc61a4ae09882e Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Sat, 16 Oct 2021 10:02:17 +1100 Subject: [PATCH 3/7] add failing test for #1418 regression --- test/integration/connection/test-typecast.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/integration/connection/test-typecast.js b/test/integration/connection/test-typecast.js index b7a2dd9ef1..8e3f3592f0 100644 --- a/test/integration/connection/test-typecast.js +++ b/test/integration/connection/test-typecast.js @@ -4,6 +4,9 @@ const common = require('../../common'); const connection = common.createConnection(); const assert = require('assert'); +connection.query('CREATE TEMPORARY TABLE json_test (json_test JSON)'); +connection.query('INSERT INTO json_test VALUES (?)', JSON.stringify({ test: 42 })); + connection.query( { sql: 'select "foo uppercase" as foo', @@ -46,4 +49,18 @@ connection.query( } ); +connection.query( + { + sql: 'SELECT * from json_test', + typeCast: function(_field, next) { + return next(); + } + }, + (err, _rows) => { + assert.ifError(err); + assert.equal(_rows[0].test.test, 42); + } +); + + connection.end(); From 1cea50824cbf8004e512182b0b6eb3b72df069c5 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Sat, 16 Oct 2021 10:27:29 +1100 Subject: [PATCH 4/7] change how readCode is applied in typeCast generated wrapper. Fixes #1418 --- lib/parsers/text_parser.js | 3 ++- test/integration/connection/test-typecast.js | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/parsers/text_parser.js b/lib/parsers/text_parser.js index 2036caed6e..5af86674aa 100644 --- a/lib/parsers/text_parser.js +++ b/lib/parsers/text_parser.js @@ -119,7 +119,8 @@ function compile(fields, options, config) { return _this.packet.parseGeometryValue(); }, readNext: function() { - return _this.${readCode}; + const packet = _this.packet; + return ${readCode}; } };`); } diff --git a/test/integration/connection/test-typecast.js b/test/integration/connection/test-typecast.js index 8e3f3592f0..c86ae8fd25 100644 --- a/test/integration/connection/test-typecast.js +++ b/test/integration/connection/test-typecast.js @@ -49,18 +49,31 @@ connection.query( } ); + connection.query( { sql: 'SELECT * from json_test', typeCast: function(_field, next) { - return next(); + return next(); } }, (err, _rows) => { assert.ifError(err); - assert.equal(_rows[0].test.test, 42); + assert.equal(_rows[0].json_test.test, 42); } ); +connection.execute( + { + sql: 'SELECT * from json_test', + typeCast: function(_field, next) { + return next(); + } + }, + (err, _rows) => { + assert.ifError(err); + assert.equal(_rows[0].json_test.test, 42); + } +); connection.end(); From aeae38e18faad56bd8544748a96d5c48b18db367 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Sat, 16 Oct 2021 10:29:58 +1100 Subject: [PATCH 5/7] lint --- test/integration/connection/test-typecast.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/connection/test-typecast.js b/test/integration/connection/test-typecast.js index c86ae8fd25..8dd82812d0 100644 --- a/test/integration/connection/test-typecast.js +++ b/test/integration/connection/test-typecast.js @@ -54,7 +54,7 @@ connection.query( { sql: 'SELECT * from json_test', typeCast: function(_field, next) { - return next(); + return next(); } }, (err, _rows) => { @@ -67,7 +67,7 @@ connection.execute( { sql: 'SELECT * from json_test', typeCast: function(_field, next) { - return next(); + return next(); } }, (err, _rows) => { From 09e2e056ab351518a611ae6b568a276cde3b0770 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Sat, 16 Oct 2021 17:07:48 +1100 Subject: [PATCH 6/7] v2.3.2 changes --- Changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changelog.md b/Changelog.md index 4d149c7513..8421f89852 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,7 @@ +2.3.2 ( 16/10/2021 ) + - fix regression causing typeCast + JSON field + to error #1418, #1420 + 2.3.1 ( 15/10/2021 ) - Update error codes up to mysql 8.0.26 #1411 - perf: optimize Query.row call #1408 From a3a34fbb09f3d554ddb7e0ca80784c3f1e471a54 Mon Sep 17 00:00:00 2001 From: Andrey Sidorov Date: Sat, 16 Oct 2021 17:07:54 +1100 Subject: [PATCH 7/7] 2.3.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e1d444448..89ac2d9fa1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mysql2", - "version": "2.3.1", + "version": "2.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mysql2", - "version": "2.3.1", + "version": "2.3.2", "license": "MIT", "dependencies": { "denque": "^2.0.1", diff --git a/package.json b/package.json index ae245b1744..c3f3e50829 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mysql2", - "version": "2.3.1", + "version": "2.3.2", "description": "fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS", "main": "index.js", "directories": {