mirror of
https://github.com/dbcli/pgcli.git
synced 2024-10-06 02:07:53 +03:00
find_prev_keyword strips everything after the last keyword
This commit is contained in:
parent
1fad19a584
commit
c7307e5a7d
@ -152,12 +152,22 @@ def extract_tables(sql):
|
||||
return list(extract_table_identifiers(stream))
|
||||
|
||||
def find_prev_keyword(sql):
|
||||
if not sql.strip():
|
||||
return None
|
||||
""" Find the last sql keyword in an SQL statement
|
||||
|
||||
for t in reversed(list(sqlparse.parse(sql)[0].flatten())):
|
||||
Returns the value of the last keyword, and the text of the query with
|
||||
everything after the last keyword stripped
|
||||
"""
|
||||
if not sql.strip():
|
||||
return None, ''
|
||||
|
||||
parsed = sqlparse.parse(sql)[0]
|
||||
for t in reversed(list(parsed.flatten())):
|
||||
if t.is_keyword or t.value == '(':
|
||||
return t.value
|
||||
idx = parsed.token_index(t)
|
||||
text = ''.join(tok.value for tok in parsed.tokens[:idx+1])
|
||||
return t.value, text
|
||||
|
||||
return None, ''
|
||||
|
||||
if __name__ == '__main__':
|
||||
sql = 'select * from (select t. from tabl t'
|
||||
|
@ -217,7 +217,7 @@ def suggest_based_on_last_token(token, text_before_cursor, full_text, identifier
|
||||
# "CREATE DATABASE <newdb> WITH TEMPLATE <db>"
|
||||
return [{'type': 'database'}]
|
||||
elif token_v.endswith(',') or token_v == '=':
|
||||
prev_keyword = find_prev_keyword(text_before_cursor)
|
||||
prev_keyword, text_before_cursor = find_prev_keyword(text_before_cursor)
|
||||
if prev_keyword:
|
||||
return suggest_based_on_last_token(
|
||||
prev_keyword, text_before_cursor, full_text, identifier)
|
||||
|
@ -1,6 +1,6 @@
|
||||
import pytest
|
||||
from pgcli.packages.parseutils import extract_tables
|
||||
|
||||
from pgcli.packages.parseutils import find_prev_keyword
|
||||
|
||||
def test_empty_string():
|
||||
tables = extract_tables('')
|
||||
@ -84,3 +84,7 @@ def test_join_as_table():
|
||||
tables = extract_tables('SELECT * FROM my_table AS m WHERE m.a > 5')
|
||||
assert tables == [(None, 'my_table', 'm')]
|
||||
|
||||
def test_find_prev_keyword_using():
|
||||
q = 'select * from tbl1 inner join tbl2 using (col1, '
|
||||
kw, q2 = find_prev_keyword(q)
|
||||
assert kw == '(' and q2 == 'select * from tbl1 inner join tbl2 using ('
|
||||
|
Loading…
Reference in New Issue
Block a user