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))
|
return list(extract_table_identifiers(stream))
|
||||||
|
|
||||||
def find_prev_keyword(sql):
|
def find_prev_keyword(sql):
|
||||||
if not sql.strip():
|
""" Find the last sql keyword in an SQL statement
|
||||||
return None
|
|
||||||
|
|
||||||
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 == '(':
|
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__':
|
if __name__ == '__main__':
|
||||||
sql = 'select * from (select t. from tabl t'
|
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>"
|
# "CREATE DATABASE <newdb> WITH TEMPLATE <db>"
|
||||||
return [{'type': 'database'}]
|
return [{'type': 'database'}]
|
||||||
elif token_v.endswith(',') or token_v == '=':
|
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:
|
if prev_keyword:
|
||||||
return suggest_based_on_last_token(
|
return suggest_based_on_last_token(
|
||||||
prev_keyword, text_before_cursor, full_text, identifier)
|
prev_keyword, text_before_cursor, full_text, identifier)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from pgcli.packages.parseutils import extract_tables
|
from pgcli.packages.parseutils import extract_tables
|
||||||
|
from pgcli.packages.parseutils import find_prev_keyword
|
||||||
|
|
||||||
def test_empty_string():
|
def test_empty_string():
|
||||||
tables = extract_tables('')
|
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')
|
tables = extract_tables('SELECT * FROM my_table AS m WHERE m.a > 5')
|
||||||
assert tables == [(None, 'my_table', 'm')]
|
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