Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/python-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ jobs:
poetry run python --version
poetry show

- name: Lint with pylint
run: poetry run pylint sql_metadata.py

- name: Test with pytest
run: poetry run pytest -vv --cov=sql_metadata --cov-report=term

- name: Lint with pylint
run: poetry run pylint sql_metadata.py

- name: Build a distribution package
run: poetry build -vvv
40 changes: 15 additions & 25 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ sqlparse = "^0.4.1"
[tool.poetry.dev-dependencies]
black = "^20.8b1"
coverage = "^5.4"
pylint = "^2.6.2"
pylint = "^2.7.0"
pytest = "^6.2.2"
pytest-cov = "^2.11.1"

Expand Down
54 changes: 37 additions & 17 deletions sql_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,26 +366,46 @@ def get_query_table_aliases(query: str) -> Dict[str, str]:
will give you {'a': 'users1', 'b': 'users2'}
"""
aliases = dict()
last_keyword_token = None
last_table_name = None
token_list = get_query_tokens(query)
for prev_token, token, nxt_token in zip(
["start"] + token_list, token_list, token_list[1:] + ["end"]
):

for token in get_query_tokens(query):
# print(token.ttype, token, last_table_name)

# handle "FROM foo alias" syntax (i.e, "AS" keyword is missing)
# if last_table_name and token.ttype is Name:
# aliases[token.value] = last_table_name
# last_table_name = False

if last_keyword_token:
if last_keyword_token.value.upper() in ["FROM", "JOIN", "INNER JOIN"]:
if prev_token != "start":
if (
prev_token.value.upper() in ["FROM", "JOIN", "INNER JOIN", "LEFT JOIN"]
and token.value != "("
):
last_table_name = token.value

elif last_table_name and last_keyword_token.value.upper() in ["AS"]:
aliases[token.value] = last_table_name
last_table_name = False

last_keyword_token = token if token.is_keyword else False
elif last_table_name:
if token.value == ".":
last_table_name = last_table_name + token.value # add the dot '.'
if (
token.value == ","
or token.is_keyword
and token.value.upper() != "AS"
): # there is no alias
aliases[""] = last_table_name
last_table_name = False
if (
prev_token.value.upper() == "AS"
): # if previous keyword was AS then we found the alias
aliases[token.value] = last_table_name
last_table_name = False
elif token.ttype is Name:
if prev_token.value == ".":
last_table_name = (
last_table_name + token.value
) # add Name to last_table_name
else: # found alias
aliases[token.value] = last_table_name
last_table_name = False

if (
nxt_token == "end" and last_table_name
): # if the last token is a tablename then there is no alias
aliases[""] = last_table_name

return aliases

Expand Down