From 2d06b9e46bc2dd37123b11374014f3a859e4d6ed Mon Sep 17 00:00:00 2001 From: Olivier Cavadenti Date: Mon, 14 Mar 2022 21:51:11 +0100 Subject: [PATCH] Stringify json value in update - Stringify a json value in update query. --- lib/query/querybuilder.js | 6 ++- .../integration2/query/update/updates.spec.js | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/query/querybuilder.js b/lib/query/querybuilder.js index 2b211b28bd..43b56c5488 100644 --- a/lib/query/querybuilder.js +++ b/lib/query/querybuilder.js @@ -1236,7 +1236,11 @@ class Builder extends EventEmitter { const obj = this._single.update || {}; this._method = 'update'; if (isString(values)) { - obj[values] = returning; + if (isPlainObject(returning)) { + obj[values] = JSON.stringify(returning); + } else { + obj[values] = returning; + } if (arguments.length > 2) { ret = arguments[2]; } diff --git a/test/integration2/query/update/updates.spec.js b/test/integration2/query/update/updates.spec.js index 53a49267f3..378a55d043 100644 --- a/test/integration2/query/update/updates.spec.js +++ b/test/integration2/query/update/updates.spec.js @@ -423,6 +423,47 @@ describe('Updates', function () { .where('email', '=', 'test1@example.com'); expect(results[0].last_name).to.equal('olivier'); }); + + it('should escaped json objects when update value #5059', async function () { + await knex.schema.dropTableIfExists('testing'); + await knex.schema.createTable('testing', (t) => { + t.increments('id'); + t.string('one'); + t.integer('two'); + }); + await knex('testing') + .update('one', { one: 123, two: 456 }) + .where('id', 1) + .testSql(function (tester) { + tester('mysql', 'update `testing` set `one` = ? where `id` = ?', [ + '{"one":123,"two":456}', + 1, + ]); + tester('pg', 'update "testing" set "one" = ? where "id" = ?', [ + '{"one":123,"two":456}', + 1, + ]); + tester( + 'pg-redshift', + 'update "testing" set "one" = ? where "id" = ?', + ['{"one":123,"two":456}', 1] + ); + tester('sqlite3', 'update `testing` set `one` = ? where `id` = ?', [ + '{"one":123,"two":456}', + 1, + ]); + tester('mysql', 'update `testing` set `one` = ? where `id` = ?', [ + '{"one":123,"two":456}', + 1, + ]); + tester( + 'mssql', + 'update [testing] set [one] = ? where [id] = ?;select @@rowcount', + ['{"one":123,"two":456}', 1] + ); + }); + await knex.schema.dropTable('testing'); + }); }); }); });