diff --git a/crates/pgt_completions/src/providers/columns.rs b/crates/pgt_completions/src/providers/columns.rs index 21aff8b6..71aa923b 100644 --- a/crates/pgt_completions/src/providers/columns.rs +++ b/crates/pgt_completions/src/providers/columns.rs @@ -110,4 +110,45 @@ mod tests { assert_eq!(description, q.description, "{}", q.message); } } + + #[tokio::test] + async fn shows_multiple_columns_if_no_relation_specified() { + let setup = r#" + create schema private; + + create table public.users ( + id serial primary key, + name text + ); + + create table public.audio_books ( + id serial primary key, + narrator text + ); + + create table private.audio_books ( + id serial primary key, + narrator_id text + ); + "#; + + let case = TestCase { + query: format!(r#"select n{};"#, CURSOR_POS), + description: "", + label: "", + message: "", + }; + + let (tree, cache) = get_test_deps(setup, case.get_input_query()).await; + let params = get_test_params(&tree, &cache, case.get_input_query()); + let mut results = complete(params); + + let _ = results.items.split_off(3); + + results.items.sort_by(|a, b| a.label.cmp(&b.label)); + + let labels: Vec = results.items.into_iter().map(|c| c.label).collect(); + + assert_eq!(labels, vec!["name", "narrator", "narrator_id"]); + } } diff --git a/crates/pgt_completions/src/relevance.rs b/crates/pgt_completions/src/relevance.rs index 4e18980c..ffe6cb22 100644 --- a/crates/pgt_completions/src/relevance.rs +++ b/crates/pgt_completions/src/relevance.rs @@ -30,6 +30,7 @@ pub(crate) struct CompletionRelevance<'a> { impl CompletionRelevance<'_> { pub fn into_score(mut self, ctx: &CompletionContext) -> i32 { + self.check_is_user_defined(); self.check_matches_schema(ctx); self.check_matches_query_input(ctx); self.check_if_catalog(ctx); @@ -168,4 +169,18 @@ impl CompletionRelevance<'_> { self.score += 30; } } + + fn check_is_user_defined(&mut self) { + let schema = match self.data { + CompletionRelevanceData::Column(c) => &c.schema_name, + CompletionRelevanceData::Function(f) => &f.schema, + CompletionRelevanceData::Table(t) => &t.schema, + }; + + let system_schemas = ["pg_catalog", "information_schema", "pg_toast"]; + + if system_schemas.contains(&schema.as_str()) { + self.score -= 10; + } + } }