-
-
Notifications
You must be signed in to change notification settings - Fork 666
Closed
Labels
Description
Given the following example
import mysql from 'mysql2/promise'
import fs from 'fs'
class Test {
vendorProperties = {
"multipleStatements":true
,"typeCast":true
,"supportBigNumbers":true
,"bigNumberStrings":true
,"dateStrings":true
,"trace":true
,"user":"root"
,"password": "oracle"
,"host":"yadamu-db1"
,"database":"sys"
,"port":3306
, infileStreamFactory : (path) => {return fs.createReadStream(path)}
}
async createConnectionPool() {
let stack, operation
try {
stack = new Error().stack;
operation = 'mysql.createPool()'
this.pool = mysql.createPool(this.vendorProperties)
console.log('Pool Created')
} catch (e) {
throw e
}
}
async getConnectionFromPool() {
let stack
try {
stack = new Error().stack;
const connection = await this.pool.getConnection()
console.log('Connection obtained')
return connection
} catch (err) {
throw err
}
}
async closeConnection(options) {
if ((this.connection !== undefined) && (typeof this.connection.release === 'function')) {
let stack;
try {
stack = new Error().stack
await this.connection.release()
this.connection = undefined;
} catch (e) {
this.connection = undefined;
throw e
}
}
};
async closePool(options) {
if ((this.pool !== undefined) && (typeof this.pool.end === 'function')) {
let stack;
try {
stack = new Error().stack
await this.pool.end()
this.pool = undefined;
} catch (e) {
this.pool = undefined;
throw e
}
}
}
async executeSQL(sqlStatement,args) {
let stack
let results
try {
stack = new Error().stack;
const [results,fields] = await this.connection.query(sqlStatement,args)
return results;
} catch (e) {
throw e
}
}
async test() {
const data = [[1 , -1.7976931348623157e308],[2,1.7976931348623157e308]]
let results
try {
await this.createConnectionPool()
this.connection = await this.getConnectionFromPool()
results = await this.executeSQL(`SET AUTOCOMMIT = 0, TIME_ZONE = '+00:00',SESSION INTERACTIVE_TIMEOUT = 600000, WAIT_TIMEOUT = 600000, SQL_MODE='ANSI_QUOTES,PAD_CHAR_TO_FULL_LENGTH', GROUP_CONCAT_MAX_LEN = 1024000, GLOBAL LOCAL_INFILE = 'ON'`);
results = await this.executeSQL(`CREATE TEMPORARY table if not exists "t1"("key" smallint ,"double_col" double); `);
results = await this.executeSQL(`insert into "t1"("key","double_col") values ?`,[data]);
results = await this.executeSQL(`select "key", "double_col", cast("double_col" as char(64)) as "cast_result" from "t1"`);
console.log(results)
await this.closeConnection();
await this.closePool();
} catch (e) {
await this.closeConnection();
await this.closePool();
console.log(e)
}
}
}
const test = new Test();
test.test().then(() => console.log('Success')).catch((e) => console.log(e))I get
C:\Development\YADAMU>node src\scratch\mysql\dbIssue.js
Pool Created
Connection obtained
[
{
key: 1,
double_col: -1.7976931348623155e+308,
cast_result: '-1.7976931348623157e308'
},
{
key: 2,
double_col: 1.7976931348623155e+308,
cast_result: '1.7976931348623157e308'
}
]
Success
As you can see the values in question appear to have been stored correctly in the database, given the cast() returns the expected values, but the values retrieved appear to have been corrupted at the least significant digits. This is working with the lastest MYSQL Docker VM (9.x).
I als see the issue when I run MYSQL2 against the latest MYSQL 8.0 docker container.
Reactions are currently unavailable