'select top(0) [t].[id] into #out from [accounts] as t left join [accounts] on 0=1;insert into [accounts] ([about], [created_at], [email], [first_name], [last_name], [logins], [updated_at]) output inserted.[id] into #out values (?, ?, ?, ?, ?, ?, ?); select [id] from #out; drop table #out;',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test@example.com',
'Test',
'User',
1,
TEST_TIMESTAMP,
],
['1']
);
});
});
it('should handle multi inserts',function(){
returnknex('accounts')
.insert(
[
{
first_name:'Test',
last_name:'User',
email:'test2@example.com',
logins:1,
about:'Lorem ipsum Dolore labore incididunt enim.',
created_at:TEST_TIMESTAMP,
updated_at:TEST_TIMESTAMP,
},
{
first_name:'Test',
last_name:'User',
email:'test3@example.com',
about:'Lorem ipsum Dolore labore incididunt enim.',
'insert into `accounts` (`about`, `created_at`, `email`, `first_name`, `last_name`, `logins`, `updated_at`) select ? as `about`, ? as `created_at`, ? as `email`, ? as `first_name`, ? as `last_name`, ? as `logins`, ? as `updated_at` union all select ? as `about`, ? as `created_at`, ? as `email`, ? as `first_name`, ? as `last_name`, ? as `logins`, ? as `updated_at`',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test2@example.com',
'Test',
'User',
1,
TEST_TIMESTAMP,
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test3@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
],
[3]
);
tester(
'oracledb',
'begin execute immediate \'insert into "accounts" ("about", "created_at", "email", "first_name", "last_name", "logins", "updated_at") values (:1, :2, :3, :4, :5, :6, :7) returning "id" into :8\' using ?, ?, ?, ?, ?, ?, ?, out ?; execute immediate \'insert into "accounts" ("about", "created_at", "email", "first_name", "last_name", "logins", "updated_at") values (:1, :2, :3, :4, :5, :6, :7) returning "id" into :8\' using ?, ?, ?, ?, ?, ?, ?, out ?;end;',
'select top(0) [t].[id] into #out from [accounts] as t left join [accounts] on 0=1;insert into [accounts] ([about], [created_at], [email], [first_name], [last_name], [logins], [updated_at]) output inserted.[id] into #out values (?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?); select [id] from #out; drop table #out;',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test2@example.com',
'Test',
'User',
1,
TEST_TIMESTAMP,
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test3@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
],
['2','3']
);
});
});
it('should allow for using the `asCallback` interface',function(ok){
knex('test_table_two')
.insert(
[
{
account_id:1,
details:
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
status:0,
},
{
account_id:2,
details:
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
status:1,
},
{
account_id:3,
details:'',
status:1,
},
],
'id',
insertTriggerOptions
)
.testSql(function(tester){
tester(
'oracledb',
'begin execute immediate \'insert into "test_table_two" ("account_id", "details", "status") values (:1, :2, :3) returning "id" into :4\' using ?, ?, ?, out ?; execute immediate \'insert into "test_table_two" ("account_id", "details", "status") values (:1, :2, :3) returning "id" into :4\' using ?, ?, ?, out ?; execute immediate \'insert into "test_table_two" ("account_id", "details", "status") values (:1, :2, :3) returning "id" into :4\' using ?, ?, ?, out ?;end;',
[
1,
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
'insert into `accounts` (`about`, `created_at`, `email`, `first_name`, `last_name`, `logins`, `updated_at`) select ? as `about`, ? as `created_at`, ? as `email`, ? as `first_name`, ? as `last_name`, ? as `logins`, ? as `updated_at` union all select ? as `about`, ? as `created_at`, ? as `email`, ? as `first_name`, ? as `last_name`, ? as `logins`, ? as `updated_at`',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test4@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test5@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
],
[5]
);
tester(
'oracledb',
'begin execute immediate \'insert into "accounts" ("about", "created_at", "email", "first_name", "last_name", "logins", "updated_at") values (:1, :2, :3, :4, :5, :6, :7) returning "id" into :8\' using ?, ?, ?, ?, ?, ?, ?, out ?; execute immediate \'insert into "accounts" ("about", "created_at", "email", "first_name", "last_name", "logins", "updated_at") values (:1, :2, :3, :4, :5, :6, :7) returning "id" into :8\' using ?, ?, ?, ?, ?, ?, ?, out ?;end;',
'select top(0) [t].[id] into #out from [accounts] as t left join [accounts] on 0=1;insert into [accounts] ([about], [created_at], [email], [first_name], [last_name], [logins], [updated_at]) output inserted.[id] into #out values (?, ?, ?, ?, ?, ?, ?), (?, ?, ?, ?, ?, ?, ?); select [id] from #out; drop table #out;',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test4@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test5@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
],
['4','5']
);
});
});
it('will fail when multiple inserts are made into a unique column',function(){
'select top(0) [t].[id] into #out from [accounts] as t left join [accounts] on 0=1;insert into [accounts] ([about], [created_at], [email], [first_name], [last_name], [logins], [updated_at]) output inserted.[id] into #out values (?, ?, ?, ?, ?, ?, ?); select [id] from #out; drop table #out;',
[
'Lorem ipsum Dolore labore incididunt enim.',
TEST_TIMESTAMP,
'test5@example.com',
'Test',
'User',
2,
TEST_TIMESTAMP,
]
);
})
.then(
function(){
thrownewError(
'There should be a fail when multi-insert are made in unique col.'
);
},
function(){}
);
});
it('should drop any where clause bindings',function(){
returnknex('accounts')
.where('id','>',1)
.orWhere('x',2)
.insert(
{
first_name:'Test',
last_name:'User',
email:'test6@example.com',
about:'Lorem ipsum Dolore labore incididunt enim.',
'select top(0) [t].[id] into #out from [accounts] as t left join [accounts] on 0=1;insert into [accounts] ([about], [created_at], [email], [first_name], [last_name], [logins], [updated_at]) output inserted.[id] into #out values (?, ?, ?, ?, ?, ?, ?); select [id] from #out; drop table #out;',
'select top(0) [t].[id] into #out from [trigger_retest_insert] as t left join [trigger_retest_insert] on 0=1;insert into [trigger_retest_insert] output inserted.[id] into #out default values; select [id] from #out; drop table #out;',
'select top(0) [t].[id] into #out from [trigger_retest_insert2] as t left join [trigger_retest_insert2] on 0=1;insert into [trigger_retest_insert2] output inserted.[id] into #out default values; select [id] from #out; drop table #out;',
[],
[1]
);
});
});
});
it('should take an array of columns to return in oracle or postgres',function(){
constinsertData={
account_id:10,
details:
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
},
]
);
tester(
'mssql',
'select top(0) [t].[account_id],[t].[details] into #out from [test_table_two] as t left join [test_table_two] on 0=1;insert into [test_table_two] ([account_id], [details], [status]) output inserted.[account_id], inserted.[details] into #out values (?, ?, ?); select [account_id],[details] from #out; drop table #out;',
[
10,
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
0,
],
[
{
account_id:10,
details:
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
status:0,
json_data:null,
},
]
);
tester(
'mssql',
'select top(0) [t].* into #out from [test_table_two] as t left join [test_table_two] on 0=1;insert into [test_table_two] ([account_id], [details], [status]) output inserted.* into #out values (?, ?, ?); select * from #out; drop table #out;',
[
10,
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
0,
],
[
{
id:5,
account_id:10,
details:
'Lorem ipsum Minim nostrud Excepteur consectetur enim ut qui sint in veniam in nulla anim do cillum sunt voluptate Duis non incididunt.',
if(err.message.includes('.onConflict() is not supported for'))
return;
}
throwerr;
}
// Check that row HAS been updated
constrows=awaitknex('upsert_tests')
.where({email:'mergetest@example.com'})
.select();
expect(rows.length).to.equal(1);
expect(rows[0].name).to.equal('AFTER');
});
it('conditionally updates rows when inserting a duplicate key to unique column and merge with where clause matching row(s) is specified',asyncfunction(){
'insert into "upsert_tests" ("email", "name") values (?, ?) on conflict ("email") do update set "email" = excluded."email", "name" = excluded."name" where "upsert_tests"."role" = ? returning "email"',
['mergetest@example.com','AFTER','tester']
);
tester(
'sqlite3',
'insert into `upsert_tests` (`email`, `name`) values (?, ?) on conflict (`email`) do update set `email` = excluded.`email`, `name` = excluded.`name` where `upsert_tests`.`role` = ?',
'.onConflict().merge().where() is not supported for'
)
)
return;
}
throwerr;
}
// Check that row HAS been updated
constrows=awaitknex('upsert_tests')
.where({email:'mergetest@example.com'})
.select();
expect(rows.length).to.equal(1);
expect(rows[0].name).to.equal('AFTER');
});
it('will silently do nothing when inserting a duplicate key to unique column and merge with where clause matching no rows is specified',asyncfunction(){
'insert into "upsert_tests" ("email", "name") values (?, ?) on conflict ("email") do update set "email" = excluded."email", "name" = excluded."name" where "upsert_tests"."role" = ? returning "email"',
['mergetest@example.com','AFTER','fake-role']
);
tester(
'sqlite3',
'insert into `upsert_tests` (`email`, `name`) values (?, ?) on conflict (`email`) do update set `email` = excluded.`email`, `name` = excluded.`name` where `upsert_tests`.`role` = ?',
"(SELECT name FROM (SELECT * FROM upsert_tests) AS t WHERE email = 'mergesource@example.com')"
),
},
'email',
insertTriggerOptions
)
.onConflict('email')
.merge()
.testSql(function(tester){
tester(
'mysql',
"insert into `upsert_tests` (`email`, `name`) values (?, (SELECT name FROM (SELECT * FROM upsert_tests) AS t WHERE email = 'mergesource@example.com')) on duplicate key update `email` = values(`email`), `name` = values(`name`)",
['mergedest@example.com']
);
tester(
'pg',
'insert into "upsert_tests" ("email", "name") values (?, (SELECT name FROM (SELECT * FROM upsert_tests) AS t WHERE email = \'mergesource@example.com\')) on conflict ("email") do update set "email" = excluded."email", "name" = excluded."name" returning "email"',
['mergedest@example.com']
);
tester(
'sqlite3',
"insert into `upsert_tests` (`email`, `name`) values (?, (SELECT name FROM (SELECT * FROM upsert_tests) AS t WHERE email = 'mergesource@example.com')) on conflict (`email`) do update set `email` = excluded.`email`, `name` = excluded.`name`",
{email:'mergedest@example.com',name:'SHOULD NOT BE USED'},
'email',
insertTriggerOptions
)
.onConflict('email')
.merge({name:knex.raw('(SELECT name FROM upsert_value_source)')})
.testSql(function(tester){
tester(
'mysql',
'insert into `upsert_tests` (`email`, `name`) values (?, ?) on duplicate key update `name` = (SELECT name FROM upsert_value_source)',
['mergedest@example.com','SHOULD NOT BE USED']
);
tester(
'pg',
'insert into "upsert_tests" ("email", "name") values (?, ?) on conflict ("email") do update set "name" = (SELECT name FROM upsert_value_source) returning "email"',
['mergedest@example.com','SHOULD NOT BE USED']
);
tester(
'sqlite3',
'insert into `upsert_tests` (`email`, `name`) values (?, ?) on conflict (`email`) do update set `name` = (SELECT name FROM upsert_value_source)',
'insert into `upsert_tests` (`email`, `name`) select ? as `email`, ? as `name` union all select ? as `email`, ? as `name` where true on conflict (`email`) do update set `email` = excluded.`email`, `name` = excluded.`name`',