From d7679a170a2853fe520b604a55afb8c68e206aaf Mon Sep 17 00:00:00 2001 From: Moritz Lell Date: Mon, 11 May 2026 15:44:17 +0200 Subject: [PATCH] Fix outdated regex in BQL interval() function The function pre-filtered the input string accepting only day, month, or year, while the function accepts more inputs. Change the regex to split only number from word. --- beanquery/query_env.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/beanquery/query_env.py b/beanquery/query_env.py index 7606b193..e5198e90 100644 --- a/beanquery/query_env.py +++ b/beanquery/query_env.py @@ -684,8 +684,11 @@ def date_part(field, x): @function([str], relativedelta) def interval(x): - """Construct a relative time interval.""" - m = re.fullmatch(r'([-+]?[0-9]+)\s+(day|month|year)s?', x) + """Construct a relative time interval. Example argument: '2 weeks'. + Further options are day, month, year, century, millenium (plural s can be + appended). Use to modify dates: `date + interval(...)`""" + x = x.lower() + m = re.fullmatch(r'([-+]?[0-9]+)\s+([a-z]+?)s?', x) if not m: return None number = int(m.group(1)) @@ -702,7 +705,7 @@ def interval(x): return relativedelta(years=number * 10) if unit == 'century': return relativedelta(years=number * 100) - if unit == 'millennium': + if unit in ['millennium', 'millenia']: return relativedelta(years=number * 1000) return None