不要怂,就是干,撸起袖子干!

Commit 687f099a by Sushant

fix(postgres): always replace returning statement for upsertQuery

1 parent 382e5543
......@@ -346,13 +346,10 @@ class PostgresQueryGenerator extends AbstractQueryGenerator {
const upsertOptions = _.defaults({ bindParam: false, returning: ['*'] }, options);
const insert = this.insertQuery(tableName, insertValues, model.rawAttributes, upsertOptions);
const update = this.updateQuery(tableName, updateValues, where, upsertOptions, model.rawAttributes);
const returningRegex = /RETURNING \*(?![\s\S]*RETURNING \*)/;
if (options.returning) {
const returningRegex = /RETURNING \*(?![\s\S]*RETURNING \*)/;
insert.query = insert.query.replace(returningRegex, `RETURNING ${primaryField} INTO primary_key`);
update.query = update.query.replace(returningRegex, `RETURNING ${primaryField} INTO primary_key`);
}
insert.query = insert.query.replace(returningRegex, `RETURNING ${primaryField} INTO primary_key`);
update.query = update.query.replace(returningRegex, `RETURNING ${primaryField} INTO primary_key`);
return this.exceptionFn(
'sequelize_upsert',
......
......@@ -1101,30 +1101,7 @@ if (dialect.startsWith('postgres')) {
{ name: 'foo' },
{ name: 'foo' },
{ 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 (\'foo\'); created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'foo\' WHERE "id" = 2; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();'
},
{
arguments: [
'myTable',
{ name: 'RETURNING *', json: '{"foo":"RETURNING *"}' },
{ name: 'RETURNING *', json: '{"foo":"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","json") VALUES (\'RETURNING *\',\'{"foo":"RETURNING *"}\'); created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'RETURNING *\',"json"=\'{"foo":"RETURNING *"}\' WHERE "id" = 2; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();'
},
{
arguments: [
'myTable',
{ name: 'foo' },
{ name: 'foo' },
{ id: 2 },
{ primaryKeyField: 'id' },
{ returning: true }
{ primaryKeyField: 'id' }
],
expectation: 'CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert(OUT created boolean, OUT primary_key text) AS $func$ BEGIN INSERT INTO "myTable" ("name") VALUES (\'foo\') RETURNING "id" INTO primary_key; created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'foo\' WHERE "id" = 2 RETURNING "id" INTO primary_key; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();'
},
......@@ -1134,8 +1111,7 @@ if (dialect.startsWith('postgres')) {
{ name: 'RETURNING *', json: '{"foo":"RETURNING *"}' },
{ name: 'RETURNING *', json: '{"foo":"RETURNING *"}' },
{ id: 2 },
{ primaryKeyField: 'id' },
{ returning: true }
{ primaryKeyField: 'id' }
],
expectation: 'CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert(OUT created boolean, OUT primary_key text) AS $func$ BEGIN INSERT INTO "myTable" ("name","json") VALUES (\'RETURNING *\',\'{"foo":"RETURNING *"}\') RETURNING "id" INTO primary_key; created := true; EXCEPTION WHEN unique_violation THEN UPDATE "myTable" SET "name"=\'RETURNING *\',"json"=\'{"foo":"RETURNING *"}\' WHERE "id" = 2 RETURNING "id" INTO primary_key; created := false; END; $func$ LANGUAGE plpgsql; SELECT * FROM pg_temp.sequelize_upsert();'
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!