diff --git a/lib/search.rb b/lib/search.rb index 318ba5f9f34..22053a8b340 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -1144,9 +1144,18 @@ class Search def self.to_tsquery(ts_config: nil, term:, joiner: nil) ts_config = ActiveRecord::Base.connection.quote(ts_config) if ts_config - escaped_term = Search.wrap_unaccent("'#{self.escape_string(term)}'") - tsquery = "TO_TSQUERY(#{ts_config || default_ts_config}, #{escaped_term})" - tsquery = "REPLACE(#{tsquery}::text, '&', '#{self.escape_string(joiner)}')::tsquery" if joiner + + # unaccent can be used only when a joiner is present because the + # additional processing and the final conversion to tsquery does not + # work well with characters that are converted to quotes by unaccent. + if joiner + tsquery = "TO_TSQUERY(#{ts_config || default_ts_config}, '#{self.escape_string(term)}')" + tsquery = "REPLACE(#{tsquery}::text, '&', '#{self.escape_string(joiner)}')::tsquery" + else + escaped_term = Search.wrap_unaccent("'#{self.escape_string(term)}'") + tsquery = "TO_TSQUERY(#{ts_config || default_ts_config}, #{escaped_term})" + end + tsquery end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 23c10fc1fa6..37590f3c4c0 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -580,6 +580,11 @@ describe Topic do end end + it 'does not result in a syntax error when removing accents' do + SiteSetting.search_ignore_accents = true + expect(Topic.similar_to('something', "it's")).to eq([]) + end + it 'does not result in a syntax error when raw is blank after cooking' do expect(Topic.similar_to('some title', '#')).to eq([]) end