diff --git a/lib/dialects/db2/query.js b/lib/dialects/db2/query.js index 1e9383aab1d2..80fd3ab7d796 100644 --- a/lib/dialects/db2/query.js +++ b/lib/dialects/db2/query.js @@ -22,7 +22,7 @@ class Query extends AbstractQuery { return value; } - async _run(connection, sql, parameters) { + async _run(connection, sql, parameters) { this.sql = sql; const benchmark = this.sequelize.options.benchmark || this.options.benchmark; let queryBegin; @@ -31,12 +31,14 @@ class Query extends AbstractQuery { } else { this.sequelize.log(`Executing (${ this.connection.uuid || 'default' }): ${ this.sql}`, this.options); } + + const errStack = new Error().stack; return new Promise((resolve, reject) => { // TRANSACTION SUPPORT if (_.startsWith(this.sql, 'BEGIN TRANSACTION')) { connection.beginTransaction(err => { if (err) { - reject(this.formatError(err)); + reject(this.formatError(err, errStack)); } else { resolve(this.formatResults()); } @@ -44,7 +46,7 @@ class Query extends AbstractQuery { } else if (_.startsWith(this.sql, 'COMMIT TRANSACTION')) { connection.commitTransaction(err => { if (err) { - reject(this.formatError(err)); + reject(this.formatError(err, errStack)); } else { resolve(this.formatResults()); } @@ -52,7 +54,7 @@ class Query extends AbstractQuery { } else if (_.startsWith(this.sql, 'ROLLBACK TRANSACTION')) { connection.rollbackTransaction(err => { if (err) { - reject(this.formatError(err)); + reject(this.formatError(err, errStack)); } else { resolve(this.formatResults()); } @@ -60,11 +62,11 @@ class Query extends AbstractQuery { } else if (_.startsWith(this.sql, 'SAVE TRANSACTION')) { connection.commitTransaction(err => { if (err) { - reject(this.formatError(err)); + reject(this.formatError(err, errStack)); } else { connection.beginTransaction(err => { if (err) { - reject(this.formatError(err)); + reject(this.formatError(err, errStack)); } else { resolve(this.formatResults()); } @@ -90,7 +92,7 @@ class Query extends AbstractQuery { } connection.prepare(newSql, (err, stmt) => { - if (err) { reject(this.formatError(err)); } + if (err) { reject(this.formatError(err, errStack)); } stmt.execute(params, (err, result, outparams) => { debug(`executed(${this.connection.uuid || 'default'}):${newSql} ${parameters ? JSON.stringify(parameters) : ''}`); @@ -108,7 +110,7 @@ class Query extends AbstractQuery { if (err) { err.sql = sql; stmt.closeSync(); - reject(this.formatError(err, connection, parameters)); + reject(this.formatError(err, errStack, connection, parameters)); } else { let data = []; let metadata = []; @@ -333,7 +335,7 @@ class Query extends AbstractQuery { }); } - formatError(err, conn, parameters) { + formatError(err, errStack, conn, parameters) { let match; if (!(err && err.message)) { @@ -389,7 +391,7 @@ class Query extends AbstractQuery { )); }); - return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields }); + return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack }); } match = err.message.match(/SQL0532N {2}A parent row cannot be deleted because the relationship "(.*)" restricts the deletion/) || @@ -399,7 +401,8 @@ class Query extends AbstractQuery { return new sequelizeErrors.ForeignKeyConstraintError({ fields: null, index: match[1], - parent: err + parent: err, + stack: errStack }); } @@ -413,11 +416,12 @@ class Query extends AbstractQuery { message: match[0], constraint, table, - parent: err + parent: err, + stack: errStack }); } - return new sequelizeErrors.DatabaseError(err); + return new sequelizeErrors.DatabaseError(err, { stack: errStack }); } @@ -446,7 +450,7 @@ class Query extends AbstractQuery { result = result || this.sql.startsWith('SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType", COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES'); return result; } - + handleShowIndexesQuery(data) { let currItem; const result = []; @@ -460,7 +464,7 @@ class Query extends AbstractQuery { unique: item.keyType === 'U', type: item.type }; - + _.forEach(item.COLNAMES.replace(/\+|-/g, x => { return ` ${ x}`; }).split(' '), column => { let columnName = column.trim(); if ( columnName ) { @@ -476,7 +480,7 @@ class Query extends AbstractQuery { result.push(currItem); } }); - return result; + return result; } handleInsertQuery(results, metaData) {