diff --git a/app/models/query.rb b/app/models/query.rb index ebf254102..e95933b08 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -1448,6 +1448,7 @@ class Query < ApplicationRecord sql = sql_contains("#{db_table}.#{db_field}", value.first) when "!~" sql = sql_contains("#{db_table}.#{db_field}", value.first, :match => false) + sql += " OR #{db_table}.#{db_field} IS NULL" if is_custom_filter when "*~" sql = sql_contains("#{db_table}.#{db_field}", value.first, :all_words => false) when "^" diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index 41df49b66..6318596f1 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -739,6 +739,15 @@ class QueryTest < ActiveSupport::TestCase assert_not_include issue, result end + def test_operator_does_not_contain_on_text_custom_field + query = IssueQuery.new(:name => '_') + query.filters = {"cf_2" => {:operator => '!~', :values => ['125']}} + result = find_issues_with_query(query) + # "cf_2" (Searchable field) custom field's available trackers are only 1:Bug and 3:Support request. + # 8(Issue.visible.where(tracker: [1,3])) - 2(contain "125") = 6(not contain "125") + assert_equal 6, result.size + end + def test_operator_contains_any_of User.current = User.find(1) query = IssueQuery.new(