diff --git a/sqlparse/keywords.py b/sqlparse/keywords.py index dd6e5d15..82fa56d3 100644 --- a/sqlparse/keywords.py +++ b/sqlparse/keywords.py @@ -159,7 +159,7 @@ def find_delimited_spans(text): (r'(?<=\.)[A-ZÀ-Ü]\w*', tokens.Name), # .'Name' (r'[A-ZÀ-Ü]\w*(?=\()', tokens.Name), # side effect: change kw to func (r'-?0x[\dA-F]+', tokens.Number.Hexadecimal), - (r'-?\d+(\.\d+)?E-?\d+', tokens.Number.Float), + (r'-?\d+(\.\d+)?E[+-]?\d+', tokens.Number.Float), (r'(?![_A-ZÀ-Ü])-?(\d+(\.\d*)|\.\d+)(?![_A-ZÀ-Ü])', tokens.Number.Float), (r'(?![_A-ZÀ-Ü])-?\d+(?![_A-ZÀ-Ü])', tokens.Number.Integer), diff --git a/tests/test_format.py b/tests/test_format.py index 93495067..0fa5b94c 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -351,6 +351,10 @@ class TestSpacesAroundOperators: def formatter(sql): return sqlparse.format(sql, use_space_around_operators=True) + @pytest.mark.parametrize('number', ['1e+3', '1E+3', '1.25e+3', '-1.25E+3']) + def test_preserves_positive_exponents(self, number): + assert self.formatter(f'SELECT {number}*2') == f'SELECT {number} * 2' + def test_basic(self): sql = ('select a+b as d from table ' 'where (c-d)%2= 1 and e> 3.0/4 and z^2 <100') diff --git a/tests/test_parse.py b/tests/test_parse.py index 67168410..e7d140d3 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -213,6 +213,10 @@ def test_placeholder(ph): ('6.67428E-8', T.Number.Float), ('1.988e33', T.Number.Float), ('1e-12', T.Number.Float), + ('1e+3', T.Number.Float), + ('1E+3', T.Number.Float), + ('1.25e+3', T.Number.Float), + ('-1.25E+3', T.Number.Float), ('e1', None), ]) def test_scientific_numbers(num, expected):