From 19974d3ab12356cc72001c17bfd9761308aae430 Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 3 Feb 2021 21:15:58 -0600 Subject: [PATCH] Fix #4688: Malformed SQL when searching `-status:any`. Negating `Post.all` produced the invalid SQL fragment `WHERE NOT ()`. Use `Post.where("TRUE")` instead to produce `WHERE NOT (TRUE)`. --- app/logical/post_query_builder.rb | 2 +- test/unit/post_query_builder_test.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index f2ab80f87..f84506a1e 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -290,7 +290,7 @@ class PostQueryBuilder when "unmoderated" Post.in_modqueue.available_for_moderation(current_user, hidden: false) when "all", "any" - Post.all + Post.where("TRUE") else Post.none end diff --git a/test/unit/post_query_builder_test.rb b/test/unit/post_query_builder_test.rb index fab1a2e36..af523de69 100644 --- a/test/unit/post_query_builder_test.rb +++ b/test/unit/post_query_builder_test.rb @@ -639,6 +639,13 @@ class PostQueryBuilderTest < ActiveSupport::TestCase assert_tag_match([disapproved], "-status:unmoderated") end + should "return nothing for the -status:any metatag" do + create(:post) + + assert_tag_match([], "-status:any") + assert_tag_match([], "-status:all") + end + should "respect the 'Deleted post filter' option when using the status: metatag" do deleted = create(:post, is_deleted: true, is_banned: true) undeleted = create(:post, is_banned: true)