From e1b5482b1413591260f41ceb50e97091928f195a Mon Sep 17 00:00:00 2001 From: Andi Albrecht Date: Sun, 8 Feb 2015 16:52:15 +0100 Subject: (postgresql) Add support for square bracket array indexing, by darikg. Pull request #170 with trivial conflicts resolved. --- sqlparse/sql.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sqlparse/sql.py') diff --git a/sqlparse/sql.py b/sqlparse/sql.py index 6174db0..c974b35 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -502,6 +502,13 @@ class Identifier(TokenList): return None return ordering.value.upper() + def get_array_indices(self): + """Returns an iterator of index expressions as strings""" + + # Use [1:-1] index to discard the square brackets + return (tok.value[1:-1] for tok in self.tokens + if tok.ttype in T.ArrayIndex) + class IdentifierList(TokenList): """A list of :class:`~sqlparse.sql.Identifier`\'s.""" -- cgit v1.2.1 From 8a23215952c409f8cc1eae1f25a3160b32e8cbdf Mon Sep 17 00:00:00 2001 From: Darik Gamble Date: Mon, 9 Feb 2015 11:59:25 -0500 Subject: TokenList convenience method _get_first_name --- sqlparse/sql.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'sqlparse/sql.py') diff --git a/sqlparse/sql.py b/sqlparse/sql.py index c974b35..5ecab92 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -433,7 +433,25 @@ class TokenList(Token): if next_ is None: # invalid identifier, e.g. "a." return None return self._remove_quotes(next_.value) + def _get_first_name(self, idx=None, reverse=False, keywords=False): + """Returns the name of the first token with a name""" + if idx and not isinstance(idx, int): + idx = self.token_index(idx) + 1 + + tokens = self.tokens[idx:] if idx else self.tokens + tokens = reversed(tokens) if reverse else tokens + types = [T.Name, T.Wildcard, T.String.Symbol] + + if keywords: + types.append(T.Keyword) + + for tok in tokens: + if tok.ttype in types: + return self._remove_quotes(tok.value) + elif isinstance(tok, Identifier) or isinstance(tok, Function): + return tok.get_name() + return None class Statement(TokenList): """Represents a SQL statement.""" -- cgit v1.2.1 From d29cadef7539515d646e1c83e5fcf92415867886 Mon Sep 17 00:00:00 2001 From: Darik Gamble Date: Mon, 9 Feb 2015 12:01:18 -0500 Subject: get_alias() uses _get_first_name(), and searches in reverse for "column expression alias" --- sqlparse/sql.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) (limited to 'sqlparse/sql.py') diff --git a/sqlparse/sql.py b/sqlparse/sql.py index 5ecab92..b28e627 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -390,21 +390,17 @@ class TokenList(Token): def get_alias(self): """Returns the alias for this identifier or ``None``.""" + + # "name AS alias" kw = self.token_next_match(0, T.Keyword, 'AS') if kw is not None: - alias = self.token_next(self.token_index(kw)) - if alias is None: - return None - else: - next_ = self.token_next_by_instance(0, Identifier) - if next_ is None: - next_ = self.token_next_by_type(0, T.String.Symbol) - if next_ is None: - return None - alias = next_ - if isinstance(alias, Identifier): - return alias.get_name() - return self._remove_quotes(unicode(alias)) + return self._get_first_name(kw, keywords=True) + + # "name alias" or "complicated column expression alias" + if len(self.tokens) > 2: + return self._get_first_name(reverse=True) + + return None def get_name(self): """Returns the name of this identifier. -- cgit v1.2.1 From b8cb68cce836ca381dbf9aee284b03791e06f5fc Mon Sep 17 00:00:00 2001 From: Darik Gamble Date: Mon, 9 Feb 2015 12:02:23 -0500 Subject: get_name() uses _get_first_name() --- sqlparse/sql.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sqlparse/sql.py') diff --git a/sqlparse/sql.py b/sqlparse/sql.py index b28e627..4fc4d72 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -418,6 +418,10 @@ class TokenList(Token): """Returns the real name (object name) of this identifier.""" # a.b dot = self.token_next_match(0, T.Punctuation, '.') + if dot is not None: + return self._get_first_name(self.token_index(dot)) + + return self._get_first_name() if dot is None: next_ = self.token_next_by_type(0, T.Name) if next_ is not None: -- cgit v1.2.1 From eb6ee3cade7a0ebbb45ddeae29a50fcb1405c5ae Mon Sep 17 00:00:00 2001 From: Darik Gamble Date: Mon, 9 Feb 2015 12:05:34 -0500 Subject: Move get_parent_name() from Identifer to TokenList (so Function can use it) --- sqlparse/sql.py | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) (limited to 'sqlparse/sql.py') diff --git a/sqlparse/sql.py b/sqlparse/sql.py index 4fc4d72..8492c5e 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -422,17 +422,20 @@ class TokenList(Token): return self._get_first_name(self.token_index(dot)) return self._get_first_name() + + def get_parent_name(self): + """Return name of the parent object if any. + + A parent object is identified by the first occuring dot. + """ + dot = self.token_next_match(0, T.Punctuation, '.') if dot is None: - next_ = self.token_next_by_type(0, T.Name) - if next_ is not None: - return self._remove_quotes(next_.value) return None - - next_ = self.token_next_by_type(self.token_index(dot), - (T.Name, T.Wildcard, T.String.Symbol)) - if next_ is None: # invalid identifier, e.g. "a." + prev_ = self.token_prev(self.token_index(dot)) + if prev_ is None: # something must be verry wrong here.. return None - return self._remove_quotes(next_.value) + return self._remove_quotes(prev_.value) + def _get_first_name(self, idx=None, reverse=False, keywords=False): """Returns the name of the first token with a name""" @@ -485,19 +488,6 @@ class Identifier(TokenList): __slots__ = ('value', 'ttype', 'tokens') - def get_parent_name(self): - """Return name of the parent object if any. - - A parent object is identified by the first occuring dot. - """ - dot = self.token_next_match(0, T.Punctuation, '.') - if dot is None: - return None - prev_ = self.token_prev(self.token_index(dot)) - if prev_ is None: # something must be verry wrong here.. - return None - return self._remove_quotes(prev_.value) - def is_wildcard(self): """Return ``True`` if this identifier contains a wildcard.""" token = self.token_next_by_type(0, T.Wildcard) -- cgit v1.2.1