1
1
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:
Darik Gamble 2015-04-06 18:28:11 -04:00
parent 1fad19a584
commit c7307e5a7d
3 changed files with 20 additions and 6 deletions

View File

@ -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'

View File

@ -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)

View File

@ -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 ('