Skip to content

Commit 7168e5c

Browse files
committed
Add support for time zone casts (fixes andialbrecht#489).
1 parent 93262c8 commit 7168e5c

5 files changed

Lines changed: 31 additions & 1 deletion

File tree

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Development Version
44
Enhancements
55

66
* Add HQL keywords (pr475, by matwalk).
7+
* Add support for time zone casts (issue489).
78

89
Bug Fixes
910

sqlparse/engine/grouping.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ def post(tlist, pidx, tidx, nidx):
8888
_group(tlist, sql.Identifier, match, valid_prev, valid_next, post)
8989

9090

91+
def group_tzcasts(tlist):
92+
def match(token):
93+
return token.ttype == T.Keyword.TZCast
94+
95+
def valid(token):
96+
return token is not None
97+
98+
def post(tlist, pidx, tidx, nidx):
99+
return pidx, nidx
100+
101+
_group(tlist, sql.Identifier, match, valid, valid, post)
102+
103+
91104
def group_period(tlist):
92105
def match(token):
93106
return token.match(T.Punctuation, '.')
@@ -358,6 +371,7 @@ def group(stmt):
358371
group_identifier,
359372
group_order,
360373
group_typecasts,
374+
group_tzcasts,
361375
group_operator,
362376
group_comparison,
363377
group_as,

sqlparse/keywords.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def is_keyword(value):
8585
(r'GROUP\s+BY\b', tokens.Keyword),
8686
(r'ORDER\s+BY\b', tokens.Keyword),
8787
(r'(LATERAL\s+VIEW\s+)(EXPLODE|INLINE|PARSE_URL_TUPLE|POSEXPLODE|STACK)\b', tokens.Keyword),
88-
88+
(r"(AT|WITH')\s+TIME\s+ZONE\s+'[^']+'", tokens.Keyword.TZCast),
8989
(r'[0-9_A-ZÀ-Ü][_$#\w]*', is_keyword),
9090

9191
(r'[;:()\[\],\.]', tokens.Punctuation),

tests/test_regressions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,9 @@ def test_issue485_split_multi():
400400
select 2;
401401
);'''
402402
assert len(sqlparse.split(p_sql)) == 1
403+
404+
405+
def test_issue489_tzcasts():
406+
p = sqlparse.parse('select bar at time zone \'UTC\' as foo')[0]
407+
assert p.tokens[-1].has_alias() is True
408+
assert p.tokens[-1].get_alias() == 'foo'

tests/test_tokenize.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,15 @@ def test_parse_order_by():
204204
assert p.tokens[0].ttype is T.Keyword
205205

206206

207+
@pytest.mark.parametrize('s', (
208+
'AT TIME ZONE \'UTC\'',
209+
))
210+
def test_parse_tzcast(s):
211+
p = sqlparse.parse(s)[0]
212+
assert len(p.tokens) == 1
213+
assert p.tokens[0].ttype == T.Keyword.TZCast
214+
215+
207216
def test_cli_commands():
208217
p = sqlparse.parse('\\copy')[0]
209218
assert len(p.tokens) == 1

0 commit comments

Comments
 (0)