Skip to content
Open
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
5 changes: 5 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
TBD
==============

Features
--------
* Allow table names to be completed with leading schema names.


Bug Fixes
--------
* Fix CamelCase fuzzy matching.
Expand Down
2 changes: 1 addition & 1 deletion mycli/packages/completion_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ def suggest_based_on_last_token(

if not schema:
# Suggest schemas
suggest.insert(0, {"type": "schema"})
suggest.insert(0, {"type": "database"})

# Only tables can be TRUNCATED, otherwise suggest views
if token_v != "truncate":
Expand Down
74 changes: 61 additions & 13 deletions test/test_completion_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,11 @@ def test_select_suggests_cols_and_funcs():
)
def test_expression_suggests_tables_views_and_schemas(expression):
suggestions = suggest_type(expression, expression)
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": []},
{"type": "view", "schema": []},
{"type": "database"},
])


@pytest.mark.parametrize(
Expand All @@ -152,17 +156,25 @@ def test_expression_suggests_tables_views_and_schemas(expression):
)
def test_expression_suggests_qualified_tables_views_and_schemas(expression):
suggestions = suggest_type(expression, expression)
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": "sch"}, {"type": "view", "schema": "sch"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": "sch"},
{"type": "view", "schema": "sch"},
])


def test_truncate_suggests_tables_and_schemas():
suggestions = suggest_type("TRUNCATE ", "TRUNCATE ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": []},
{"type": "database"},
])


def test_truncate_suggests_qualified_tables():
suggestions = suggest_type("TRUNCATE sch.", "TRUNCATE sch.")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": "sch"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": "sch"},
])


def test_distinct_suggests_cols():
Expand All @@ -182,12 +194,20 @@ def test_col_comma_suggests_cols():

def test_table_comma_suggests_tables_and_schemas():
suggestions = suggest_type("SELECT a, b FROM tbl1, ", "SELECT a, b FROM tbl1, ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])


def test_into_suggests_tables_and_schemas():
suggestion = suggest_type("INSERT INTO ", "INSERT INTO ")
assert sorted_dicts(suggestion) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestion) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])


def test_insert_into_lparen_suggests_cols():
Expand Down Expand Up @@ -293,7 +313,11 @@ def test_outer_table_reference_in_exists_subquery_suggests_columns():
)
def test_sub_select_table_name_completion(expression):
suggestion = suggest_type(expression, expression)
assert sorted_dicts(suggestion) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestion) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])


def test_sub_select_col_name_completion():
Expand Down Expand Up @@ -330,7 +354,11 @@ def test_sub_select_dot_col_name_completion():
def test_join_suggests_tables_and_schemas(tbl_alias, join_type):
text = f"SELECT * FROM abc {tbl_alias} {join_type} JOIN "
suggestion = suggest_type(text, text)
assert sorted_dicts(suggestion) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestion) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])


@pytest.mark.parametrize(
Expand Down Expand Up @@ -440,7 +468,11 @@ def test_two_join_alias_dot_suggests_cols1(sql):

def test_2_statements_2nd_current():
suggestions = suggest_type("select * from a; select * from ", "select * from a; select * from ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": []},
{"type": "view", "schema": []},
{"type": "database"},
])

suggestions = suggest_type("select * from a; select from b", "select * from a; select ")
assert sorted_dicts(suggestions) == sorted_dicts([
Expand All @@ -452,12 +484,20 @@ def test_2_statements_2nd_current():

# Should work even if first statement is invalid
suggestions = suggest_type("select * from; select * from ", "select * from; select * from ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "table", "schema": []},
{"type": "view", "schema": []},
{"type": "database"},
])


def test_2_statements_1st_current():
suggestions = suggest_type("select * from ; select * from b", "select * from ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])

suggestions = suggest_type("select from a; select * from b", "select ")
assert sorted_dicts(suggestions) == sorted_dicts([
Expand All @@ -470,7 +510,11 @@ def test_2_statements_1st_current():

def test_3_statements_2nd_current():
suggestions = suggest_type("select * from a; select * from ; select * from c", "select * from a; select * from ")
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])

suggestions = suggest_type("select * from a; select from b; select * from c", "select * from a; select ")
assert sorted_dicts(suggestions) == sorted_dicts([
Expand Down Expand Up @@ -516,7 +560,11 @@ def test_handle_pre_completion_comma_gracefully(text):
def test_cross_join():
text = "select * from v1 cross join v2 JOIN v1.id, "
suggestions = suggest_type(text, text)
assert sorted_dicts(suggestions) == sorted_dicts([{"type": "table", "schema": []}, {"type": "view", "schema": []}, {"type": "schema"}])
assert sorted_dicts(suggestions) == sorted_dicts([
{"type": "database"},
{"type": "table", "schema": []},
{"type": "view", "schema": []},
])


@pytest.mark.parametrize(
Expand Down