summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Albrecht <albrecht.andi@gmail.com>2019-05-16 07:56:57 +0200
committerAndi Albrecht <albrecht.andi@gmail.com>2019-05-16 07:56:57 +0200
commit7168e5ce67119d0c171be7dac36bd7d21f762589 (patch)
tree2d96e5d6e7118c0c66099d2c2b61b2574d56702f
parent93262c895b955ff50a1bc13536de3024d3eede50 (diff)
downloadsqlparse-7168e5ce67119d0c171be7dac36bd7d21f762589.tar.gz
Add support for time zone casts (fixes #489).
-rw-r--r--CHANGELOG1
-rw-r--r--sqlparse/engine/grouping.py14
-rw-r--r--sqlparse/keywords.py2
-rw-r--r--tests/test_regressions.py6
-rw-r--r--tests/test_tokenize.py9
5 files changed, 31 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 5ad3f28..e9a4662 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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