diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index 466a800656..dbcfc7f13b 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -221,8 +221,8 @@ class Parser(object): return ['and', lhs, self.and_expression()] # Account for the optional 'and' - if (self.token_type() in [self.WORD, self.QUOTED_WORD] and - self.lcase_token() != 'or'): + if ((self.token_type() in [self.WORD, self.QUOTED_WORD] or self.token() == '(') + and self.lcase_token() != 'or'): return ['and', lhs, self.and_expression()] return lhs diff --git a/src/calibre/utils/search_query_parser_test.py b/src/calibre/utils/search_query_parser_test.py index 15a29d42f6..6f7ba1ca45 100644 --- a/src/calibre/utils/search_query_parser_test.py +++ b/src/calibre/utils/search_query_parser_test.py @@ -322,6 +322,7 @@ class Tester(SearchQueryParser): 'author:S\\"calzi': {343}, '"S\\"calzi"': {343}, 'M\\\\cMurtry': {427}, + 'author:Tolstoy (tag:txt OR tag:pdf)': set([55, 56]), } fields = {'title':0, 'author':1, 'publisher':2, 'tag':3}