summaryrefslogtreecommitdiff
path: root/sqlparse/sql.py
diff options
context:
space:
mode:
authorAndreas Albrecht <a.albrecht@Mac-PU08.prounix.local>2019-10-09 11:14:27 +0200
committerAndreas Albrecht <a.albrecht@Mac-PU08.prounix.local>2019-10-09 11:14:27 +0200
commite8ae45d9f0e4238add9e24af2b8cfbc1665aab77 (patch)
tree451cba08a3ac2f9e7c8e56abc3133acb33a13538 /sqlparse/sql.py
parent91cfc1bfcd86640538fa98b6ceaae64d0d4c9328 (diff)
downloadsqlparse-e8ae45d9f0e4238add9e24af2b8cfbc1665aab77.tar.gz
Restrict detection of alias names (fixes #455).
This change adopts some parts of the pull request #509 by john-bodley. Thanks!
Diffstat (limited to 'sqlparse/sql.py')
-rw-r--r--sqlparse/sql.py42
1 files changed, 27 insertions, 15 deletions
diff --git a/sqlparse/sql.py b/sqlparse/sql.py
index a752555..cff501c 100644
--- a/sqlparse/sql.py
+++ b/sqlparse/sql.py
@@ -16,6 +16,29 @@ from sqlparse.compat import string_types, text_type, unicode_compatible
from sqlparse.utils import imt, remove_quotes
+class NameAliasMixin:
+ """Implements get_real_name and get_alias."""
+
+ def get_real_name(self):
+ """Returns the real name (object name) of this identifier."""
+ # a.b
+ dot_idx, _ = self.token_next_by(m=(T.Punctuation, '.'))
+ return self._get_first_name(dot_idx, real_name=True)
+
+ def get_alias(self):
+ """Returns the alias for this identifier or ``None``."""
+
+ # "name AS alias"
+ kw_idx, kw = self.token_next_by(m=(T.Keyword, 'AS'))
+ if kw is not None:
+ return self._get_first_name(kw_idx + 1, keywords=True)
+
+ # "name alias" or "complicated column expression alias"
+ _, ws = self.token_next_by(t=T.Whitespace)
+ if len(self.tokens) > 2 and ws is not None:
+ return self._get_first_name(reverse=True)
+
+
@unicode_compatible
class Token(object):
"""Base class for all other classes in this module.
@@ -341,16 +364,7 @@ class TokenList(Token):
def get_alias(self):
"""Returns the alias for this identifier or ``None``."""
-
- # "name AS alias"
- kw_idx, kw = self.token_next_by(m=(T.Keyword, 'AS'))
- if kw is not None:
- return self._get_first_name(kw_idx + 1, keywords=True)
-
- # "name alias" or "complicated column expression alias"
- _, ws = self.token_next_by(t=T.Whitespace)
- if len(self.tokens) > 2 and ws is not None:
- return self._get_first_name(reverse=True)
+ return None
def get_name(self):
"""Returns the name of this identifier.
@@ -363,9 +377,7 @@ class TokenList(Token):
def get_real_name(self):
"""Returns the real name (object name) of this identifier."""
- # a.b
- dot_idx, _ = self.token_next_by(m=(T.Punctuation, '.'))
- return self._get_first_name(dot_idx, real_name=True)
+ return None
def get_parent_name(self):
"""Return name of the parent object if any.
@@ -433,7 +445,7 @@ class Statement(TokenList):
return 'UNKNOWN'
-class Identifier(TokenList):
+class Identifier(NameAliasMixin, TokenList):
"""Represents an identifier.
Identifiers may have aliases or typecasts.
@@ -599,7 +611,7 @@ class Case(TokenList):
return ret
-class Function(TokenList):
+class Function(NameAliasMixin, TokenList):
"""A function or procedure call."""
def get_parameters(self):