Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(postgres): check and enable standard conforming strings when required #10746

Merged
merged 4 commits into from Apr 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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