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

Commit bf837ec3 by netsgnut Committed by Sushant

feat(sqlite/query-generator): support delete/destory with limit via rowid for SQLite (#8494)

1 parent a07fb759
...@@ -288,12 +288,25 @@ const QueryGenerator = { ...@@ -288,12 +288,25 @@ const QueryGenerator = {
options = options || {}; options = options || {};
_.defaults(options, this.options); _.defaults(options, this.options);
if (options.truncate === true) {
// Truncate does not allow LIMIT and WHERE
return `DELETE FROM ${this.quoteTable(tableName)}`;
}
if (_.isUndefined(options.limit)) {
options.limit = 1;
}
let whereClause = this.getWhereConditions(where, null, model, options); let whereClause = this.getWhereConditions(where, null, model, options);
if (whereClause) { if (whereClause) {
whereClause = ' WHERE ' + whereClause; whereClause = `WHERE ${whereClause}`;
}
if (options.limit) {
whereClause = `WHERE rowid IN (SELECT rowid FROM ${this.quoteTable(tableName)} ${whereClause} LIMIT ${this.escape(options.limit)})`;
} }
return `DELETE FROM ${this.quoteTable(tableName)}${whereClause}`; return `DELETE FROM ${this.quoteTable(tableName)} ${whereClause}`;
}, },
attributesToSQL(attributes) { attributesToSQL(attributes) {
......
...@@ -86,6 +86,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -86,6 +86,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
), { ), {
default: "DELETE FROM [public.test_users] WHERE `name` = 'foo'", default: "DELETE FROM [public.test_users] WHERE `name` = 'foo'",
postgres: 'DELETE FROM "public"."test_users" WHERE "name" = \'foo\'', postgres: 'DELETE FROM "public"."test_users" WHERE "name" = \'foo\'',
sqlite: "DELETE FROM `public.test_users` WHERE `name` = 'foo'",
mssql: "DELETE FROM [public].[test_users] WHERE [name] = N'foo'; SELECT @@ROWCOUNT AS AFFECTEDROWS;" mssql: "DELETE FROM [public].[test_users] WHERE [name] = N'foo'; SELECT @@ROWCOUNT AS AFFECTEDROWS;"
} }
); );
...@@ -108,7 +109,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -108,7 +109,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
User User
), { ), {
postgres: 'DELETE FROM "public"."test_users" WHERE "id" IN (SELECT "id" FROM "public"."test_users" WHERE "name" = \'foo\'\';DROP TABLE mySchema.myTable;\' LIMIT 10)', postgres: 'DELETE FROM "public"."test_users" WHERE "id" IN (SELECT "id" FROM "public"."test_users" WHERE "name" = \'foo\'\';DROP TABLE mySchema.myTable;\' LIMIT 10)',
sqlite: "DELETE FROM `public.test_users` WHERE `name` = 'foo'';DROP TABLE mySchema.myTable;'", sqlite: "DELETE FROM `public.test_users` WHERE rowid IN (SELECT rowid FROM `public.test_users` WHERE `name` = \'foo\'\';DROP TABLE mySchema.myTable;\' LIMIT 10)",
mssql: "DELETE TOP(10) FROM [public].[test_users] WHERE [name] = N'foo'';DROP TABLE mySchema.myTable;'; SELECT @@ROWCOUNT AS AFFECTEDROWS;", mssql: "DELETE TOP(10) FROM [public].[test_users] WHERE [name] = N'foo'';DROP TABLE mySchema.myTable;'; SELECT @@ROWCOUNT AS AFFECTEDROWS;",
default: "DELETE FROM [public.test_users] WHERE `name` = 'foo\\';DROP TABLE mySchema.myTable;' LIMIT 10" default: "DELETE FROM [public.test_users] WHERE `name` = 'foo\\';DROP TABLE mySchema.myTable;' LIMIT 10"
} }
...@@ -139,7 +140,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -139,7 +140,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
return expectsql( return expectsql(
query, { query, {
postgres: new Error('Cannot LIMIT delete without a model.'), postgres: new Error('Cannot LIMIT delete without a model.'),
sqlite: "DELETE FROM `public.test_users` WHERE `name` = 'foo'';DROP TABLE mySchema.myTable;'", sqlite: "DELETE FROM `public.test_users` WHERE rowid IN (SELECT rowid FROM `public.test_users` WHERE `name` = 'foo'';DROP TABLE mySchema.myTable;' LIMIT 10)",
mssql: "DELETE TOP(10) FROM [public].[test_users] WHERE [name] = N'foo'';DROP TABLE mySchema.myTable;'; SELECT @@ROWCOUNT AS AFFECTEDROWS;", mssql: "DELETE TOP(10) FROM [public].[test_users] WHERE [name] = N'foo'';DROP TABLE mySchema.myTable;'; SELECT @@ROWCOUNT AS AFFECTEDROWS;",
default: "DELETE FROM [public.test_users] WHERE `name` = 'foo\\';DROP TABLE mySchema.myTable;' LIMIT 10" default: "DELETE FROM [public.test_users] WHERE `name` = 'foo\\';DROP TABLE mySchema.myTable;' LIMIT 10"
} }
...@@ -173,7 +174,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -173,7 +174,7 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
User User
), { ), {
postgres: 'DELETE FROM "test_user" WHERE "test_user_id" IN (SELECT "test_user_id" FROM "test_user" WHERE "test_user_id" = 100 LIMIT 1)', postgres: 'DELETE FROM "test_user" WHERE "test_user_id" IN (SELECT "test_user_id" FROM "test_user" WHERE "test_user_id" = 100 LIMIT 1)',
sqlite: 'DELETE FROM `test_user` WHERE `test_user_id` = 100', sqlite: 'DELETE FROM `test_user` WHERE rowid IN (SELECT rowid FROM `test_user` WHERE `test_user_id` = 100 LIMIT 1)',
mssql: 'DELETE TOP(1) FROM [test_user] WHERE [test_user_id] = 100; SELECT @@ROWCOUNT AS AFFECTEDROWS;', mssql: 'DELETE TOP(1) FROM [test_user] WHERE [test_user_id] = 100; SELECT @@ROWCOUNT AS AFFECTEDROWS;',
default: 'DELETE FROM [test_user] WHERE [test_user_id] = 100 LIMIT 1' default: 'DELETE FROM [test_user] WHERE [test_user_id] = 100 LIMIT 1'
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!