Skip to content

Commit

Permalink
feat(postgres): enable standard conforming strings when required (#10746
Browse files Browse the repository at this point in the history
)
  • Loading branch information
sushantdhiman committed Apr 10, 2019
1 parent 7c3c18a commit 850c7fd
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 6 deletions.
5 changes: 4 additions & 1 deletion lib/dialects/abstract/connection-manager.js
Expand Up @@ -256,7 +256,10 @@ class ConnectionManager {
//avoiding a useless round trip
if (this.sequelize.options.databaseVersion === 0) {
return this.sequelize.databaseVersion(_options).then(version => {
this.sequelize.options.databaseVersion = semver.valid(version) ? version : this.defaultVersion;
const parsedVersion = _.get(semver.coerce(version), 'version') || version;
this.sequelize.options.databaseVersion = semver.valid(parsedVersion)
? parsedVersion
: this.defaultVersion;
this.versionPromise = null;
return this._disconnect(connection);
});
Expand Down
34 changes: 29 additions & 5 deletions lib/dialects/postgres/connection-manager.js
Expand Up @@ -122,6 +122,23 @@ class ConnectionManager extends AbstractConnectionManager {
let responded = false;

const connection = new this.lib.Client(connectionConfig);

const parameterHandler = message => {
switch (message.parameterName) {
case 'server_version':
if (this.sequelize.options.databaseVersion === 0) {
const version = semver.coerce(message.parameterValue).version;
this.sequelize.options.databaseVersion = semver.valid(version)
? version
: this.defaultVersion;
}
break;
case 'standard_conforming_strings':
connection['standard_conforming_strings'] = message.parameterValue;
break;
}
};

const endHandler = () => {
debug('connection timeout');
if (!responded) {
Expand All @@ -133,8 +150,19 @@ class ConnectionManager extends AbstractConnectionManager {
// node-postgres does not treat this as an error since no active query was ever emitted
connection.once('end', endHandler);

if (!this.sequelize.config.native) {
// Receive various server parameters for further configuration
connection.connection.on('parameterStatus', parameterHandler);
}

connection.connect(err => {
responded = true;

if (!this.sequelize.config.native) {
// remove parameter handler
connection.connection.removeListener('parameterStatus', parameterHandler);
}

if (err) {
if (err.code) {
switch (err.code) {
Expand Down Expand Up @@ -166,11 +194,7 @@ class ConnectionManager extends AbstractConnectionManager {
}).tap(connection => {
let query = '';

if (
this.sequelize.options.databaseVersion !== 0
&& semver.gte(this.sequelize.options.databaseVersion, '8.2.0')
&& semver.lt(this.sequelize.options.databaseVersion, '9.1.0')
) {
if (connection['standard_conforming_strings'] !== 'on') {
// Disable escape characters in strings
// see https://github.com/sequelize/sequelize/issues/3545 (security issue)
// see https://www.postgresql.org/docs/current/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS
Expand Down

0 comments on commit 850c7fd

Please sign in to comment.