diff --git a/lib/dialects/postgres/query-generator.js b/lib/dialects/postgres/query-generator.js index 53511c017caa..e133b0185c8a 100755 --- a/lib/dialects/postgres/query-generator.js +++ b/lib/dialects/postgres/query-generator.js @@ -347,8 +347,10 @@ class PostgresQueryGenerator extends AbstractQueryGenerator { const insert = this.insertQuery(tableName, insertValues, model.rawAttributes, upsertOptions); const update = this.updateQuery(tableName, updateValues, where, upsertOptions, model.rawAttributes); - insert.query = insert.query.replace('RETURNING *', `RETURNING ${primaryField} INTO primary_key`); - update.query = update.query.replace('RETURNING *', `RETURNING ${primaryField} INTO primary_key`); + if (options.returning) { + insert.query = insert.query.replace(/RETURNING \*(?![\s\S]*RETURNING \*)/, `RETURNING ${primaryField} INTO primary_key`); + update.query = update.query.replace(/RETURNING \*(?![\s\S]*RETURNING \*)/, `RETURNING ${primaryField} INTO primary_key`); + } return this.exceptionFn( 'sequelize_upsert', diff --git a/test/unit/dialects/postgres/query-generator.test.js b/test/unit/dialects/postgres/query-generator.test.js index d25043d5360d..d93f8a38786a 100644 --- a/test/unit/dialects/postgres/query-generator.test.js +++ b/test/unit/dialects/postgres/query-generator.test.js @@ -44,12 +44,14 @@ if (dialect.startsWith('postgres')) { expectation: 'CREATE DATABASE "myDatabase" ENCODING = \'UTF8\' LC_COLLATE = \'en_US.UTF-8\' LC_CTYPE = \'zh_TW.UTF-8\' TEMPLATE = \'template0\';' } ], + dropDatabaseQuery: [ { arguments: ['myDatabase'], expectation: 'DROP DATABASE IF EXISTS "myDatabase";' } ], + arithmeticQuery: [ { title: 'Should use the plus operator', @@ -87,6 +89,7 @@ if (dialect.startsWith('postgres')) { expectation: 'UPDATE "myTable" SET "foo"="foo"- \'bar\'' } ], + attributesToSQL: [ { arguments: [{ id: 'INTEGER' }], @@ -1091,6 +1094,31 @@ if (dialect.startsWith('postgres')) { } ], + upsertQuery: [ + { + arguments: [ + 'myTable', + { name: 'RETURNING *' }, + { name: 'RETURNING *' }, + { id: 2 }, + { primaryKeyField: 'id' }, + { returning: false } + ], + expectation: 'CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert(OUT created boolean, OUT primary_key text) AS $func$ BEGIN INSERT INTO "myTable" ("name") VALUES (\'RETURNING *\'); created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'RETURNING *\' WHERE "id" = 2; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();' + }, + { + arguments: [ + 'myTable', + { name: 'RETURNING *' }, + { name: 'RETURNING *' }, + { id: 2 }, + { primaryKeyField: 'id' }, + { returning: true } + ], + expectation: 'CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert(OUT created boolean, OUT primary_key text) AS $func$ BEGIN INSERT INTO "myTable" ("name") VALUES (\'RETURNING *\') RETURNING "id" INTO primary_key; created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'RETURNING *\' WHERE "id" = 2 RETURNING "id" INTO primary_key; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();' + } + ], + removeIndexQuery: [ { arguments: ['User', 'user_foo_bar'],