diff options
| author | Andi Albrecht <albrecht.andi@gmail.com> | 2019-05-16 07:56:57 +0200 |
|---|---|---|
| committer | Andi Albrecht <albrecht.andi@gmail.com> | 2019-05-16 07:56:57 +0200 |
| commit | 7168e5ce67119d0c171be7dac36bd7d21f762589 (patch) | |
| tree | 2d96e5d6e7118c0c66099d2c2b61b2574d56702f | |
| parent | 93262c895b955ff50a1bc13536de3024d3eede50 (diff) | |
| download | sqlparse-7168e5ce67119d0c171be7dac36bd7d21f762589.tar.gz | |
Add support for time zone casts (fixes #489).
| -rw-r--r-- | CHANGELOG | 1 | ||||
| -rw-r--r-- | sqlparse/engine/grouping.py | 14 | ||||
| -rw-r--r-- | sqlparse/keywords.py | 2 | ||||
| -rw-r--r-- | tests/test_regressions.py | 6 | ||||
| -rw-r--r-- | tests/test_tokenize.py | 9 |
5 files changed, 31 insertions, 1 deletions
@@ -4,6 +4,7 @@ Development Version Enhancements * Add HQL keywords (pr475, by matwalk). +* Add support for time zone casts (issue489). Bug Fixes diff --git a/sqlparse/engine/grouping.py b/sqlparse/engine/grouping.py index afc9123..ab97ec6 100644 --- a/sqlparse/engine/grouping.py +++ b/sqlparse/engine/grouping.py @@ -88,6 +88,19 @@ def group_typecasts(tlist): _group(tlist, sql.Identifier, match, valid_prev, valid_next, post) +def group_tzcasts(tlist): + def match(token): + return token.ttype == T.Keyword.TZCast + + def valid(token): + return token is not None + + def post(tlist, pidx, tidx, nidx): + return pidx, nidx + + _group(tlist, sql.Identifier, match, valid, valid, post) + + def group_period(tlist): def match(token): return token.match(T.Punctuation, '.') @@ -358,6 +371,7 @@ def group(stmt): group_identifier, group_order, group_typecasts, + group_tzcasts, group_operator, group_comparison, group_as, diff --git a/sqlparse/keywords.py b/sqlparse/keywords.py index d929cbf..2444b22 100644 --- a/sqlparse/keywords.py +++ b/sqlparse/keywords.py @@ -85,7 +85,7 @@ SQL_REGEX = { (r'GROUP\s+BY\b', tokens.Keyword), (r'ORDER\s+BY\b', tokens.Keyword), (r'(LATERAL\s+VIEW\s+)(EXPLODE|INLINE|PARSE_URL_TUPLE|POSEXPLODE|STACK)\b', tokens.Keyword), - + (r"(AT|WITH')\s+TIME\s+ZONE\s+'[^']+'", tokens.Keyword.TZCast), (r'[0-9_A-ZÀ-Ü][_$#\w]*', is_keyword), (r'[;:()\[\],\.]', tokens.Punctuation), diff --git a/tests/test_regressions.py b/tests/test_regressions.py index ce8c41f..2ed0ff3 100644 --- a/tests/test_regressions.py +++ b/tests/test_regressions.py @@ -400,3 +400,9 @@ select 1; select 2; );''' assert len(sqlparse.split(p_sql)) == 1 + + +def test_issue489_tzcasts(): + p = sqlparse.parse('select bar at time zone \'UTC\' as foo')[0] + assert p.tokens[-1].has_alias() is True + assert p.tokens[-1].get_alias() == 'foo' diff --git a/tests/test_tokenize.py b/tests/test_tokenize.py index e65a651..2748b1b 100644 --- a/tests/test_tokenize.py +++ b/tests/test_tokenize.py @@ -204,6 +204,15 @@ def test_parse_order_by(): assert p.tokens[0].ttype is T.Keyword +@pytest.mark.parametrize('s', ( + 'AT TIME ZONE \'UTC\'', +)) +def test_parse_tzcast(s): + p = sqlparse.parse(s)[0] + assert len(p.tokens) == 1 + assert p.tokens[0].ttype == T.Keyword.TZCast + + def test_cli_commands(): p = sqlparse.parse('\\copy')[0] assert len(p.tokens) == 1 |
