From db7c614e934a98b845a1331f18f8f5f16058b7c6 Mon Sep 17 00:00:00 2001 From: Dan Rzeppa Date: Tue, 24 Sep 2019 08:43:44 -0400 Subject: [PATCH] Added flexibility to IN clause processing so if an empty literal or a literal equal to () is passed, it will generate a 1=0. --- lib/dialect/postgres.js | 4 ++ test/dialects/in-clause-tests.js | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/lib/dialect/postgres.js b/lib/dialect/postgres.js index 9b81af25..c3a88133 100644 --- a/lib/dialect/postgres.js +++ b/lib/dialect/postgres.js @@ -508,6 +508,10 @@ Postgres.prototype.visitIn = function(binary) { } else { text += '1=0'; } + } else if (binary.right.type === 'LITERAL') { + var right=this.visit(binary.right) + if (!right || !right[0] || right[0] === '()') text += '1=0' + else text += this.visit(binary.left) + ' IN ' + right } else { text += this.visit(binary.left) + ' IN ' + this.visit(binary.right); } diff --git a/test/dialects/in-clause-tests.js b/test/dialects/in-clause-tests.js index 513c7243..eff1db21 100644 --- a/test/dialects/in-clause-tests.js +++ b/test/dialects/in-clause-tests.js @@ -177,3 +177,79 @@ Harness.test({ }, params: [1, 2] }); + +Harness.test({ + query: post.select(post.star()).where(post.id.in(post.literal(''))), + pg: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + sqlite: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + mysql: { + text : 'SELECT `post`.* FROM `post` WHERE (1=0)', + string: 'SELECT `post`.* FROM `post` WHERE (1=0)' + }, + mssql: { + text : 'SELECT [post].* FROM [post] WHERE (1=0)', + string: 'SELECT [post].* FROM [post] WHERE (1=0)' + }, + oracle: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in(post.literal('()'))), + pg: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + sqlite: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + mysql: { + text : 'SELECT `post`.* FROM `post` WHERE (1=0)', + string: 'SELECT `post`.* FROM `post` WHERE (1=0)' + }, + mssql: { + text : 'SELECT [post].* FROM [post] WHERE (1=0)', + string: 'SELECT [post].* FROM [post] WHERE (1=0)' + }, + oracle: { + text : 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in(post.literal('(10,20)'))), + pg: { + text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))' + }, + sqlite: { + text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))' + }, + mysql: { + text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (10,20))', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (10,20))' + }, + mssql: { + text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (10,20))', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (10,20))' + }, + oracle: { + text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (10,20))' + }, + params: [] +}); +