diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 16a6015ee..45d4f9879 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -118,13 +118,14 @@ jobs: path: | ~/.cargo/bin/tree-sitter ~/.cargo/bin/sqlx + ~/.cargo/bin/cargo-sqlx key: ${{ runner.os }}-tree-sitter-${{ hashFiles('rust-toolchain.toml') }} - name: Setup tree-sitter - run: cargo install tree-sitter-cli + run: command -v tree-sitter || cargo install tree-sitter-cli - name: Setup sqlx-cli - run: cargo install sqlx-cli + run: command -v sqlx ||cargo install sqlx-cli - name: Setup Bun uses: oven-sh/setup-bun@v2 @@ -186,7 +187,7 @@ jobs: key: ${{ runner.os }}-tree-sitter-${{ hashFiles('rust-toolchain.toml') }} - name: Setup Postgres - run: cargo install tree-sitter-cli + run: command -v tree-sitter || cargo install tree-sitter-cli - name: Run tests run: cargo test --workspace @@ -222,7 +223,7 @@ jobs: ~/.cargo/bin/tree-sitter key: ${{ runner.os }}-tree-sitter-${{ hashFiles('rust-toolchain.toml') }} - name: setup tree-sitter - run: cargo install tree-sitter-cli + run: command -v tree-sitter || cargo install tree-sitter-cli - name: Build main binary run: cargo build -p pgls_cli --release - name: Setup Bun @@ -230,16 +231,6 @@ jobs: - name: Install JS dependencies run: bun install - - name: Build backend-jsonrpc (deprecated) - working-directory: packages/@postgrestools/backend-jsonrpc - run: bun run build - - name: Run backend-jsonrpc test (deprecated) - working-directory: packages/@postgrestools/backend-jsonrpc - run: bun run test - - name: Run cli test (deprecated) - working-directory: packages/@postgrestools/postgrestools - run: bun run test - - name: Build backend-jsonrpc working-directory: packages/@postgres-language-server/backend-jsonrpc run: bun run build @@ -281,7 +272,7 @@ jobs: ~/.cargo/bin/tree-sitter key: ${{ runner.os }}-tree-sitter-${{ hashFiles('rust-toolchain.toml') }} - name: setup tree-sitter - run: cargo install tree-sitter-cli + run: command -v tree-sitter || cargo install tree-sitter-cli - name: Ensure RustFMT on nightly toolchain run: rustup component add rustfmt --toolchain nightly - name: echo toolchain diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1c4b00aea..87daee5bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,7 +79,7 @@ jobs: key: ${{ runner.os }}-tree-sitter-${{ hashFiles('rust-toolchain.toml') }} - name: Setup tree-sitter - run: cargo install tree-sitter-cli + run: command -v tree-sitter || cargo install tree-sitter-cli - name: Setup Postgres uses: ./.github/actions/setup-postgres diff --git a/crates/pgls_completions/src/builder.rs b/crates/pgls_completions/src/builder.rs index db6be9e1c..e7992d7c3 100644 --- a/crates/pgls_completions/src/builder.rs +++ b/crates/pgls_completions/src/builder.rs @@ -42,6 +42,8 @@ impl<'a> CompletionBuilder<'a> { item.score.calc_score(self.ctx); } + items.retain(|i| !i.score.should_skip()); + items.sort_by(|a, b| { b.score .get_score() diff --git a/crates/pgls_completions/src/providers/columns.rs b/crates/pgls_completions/src/providers/columns.rs index eda6fdcd1..248c8d087 100644 --- a/crates/pgls_completions/src/providers/columns.rs +++ b/crates/pgls_completions/src/providers/columns.rs @@ -79,12 +79,12 @@ mod tests { TestCompletionsCase::new() .inside_static_statement(r#" select * from ( - + from private.audio_books ) as subquery join public.users u on u.id = subquery.id; "#) - .type_sql("select id, narrator_id<1> from private.audio_books") + .type_sql("select id, narrator_id<1>") .comment("Should prefer the one from private.audio_audiobooks, since the other tables are out of scope.") ) .snapshot("handles_nested_queries") @@ -439,9 +439,9 @@ mod tests { "select name from instruments i join others o on i.z = o.a ", ) .type_sql("where o.<1>a = <2>i.z and <3>i.id > 5;") - .comment("should respect alias speciifcation") - .comment("should not prioritize suggest columns or schemas (right side of binary expression)") - .comment("should prioritize columns that aren't already mentioned") + .comment("should respect alias speciifcation") + .comment("should not prioritize suggest columns or schemas (right side of binary expression)") + .comment("should prioritize columns that aren't already mentioned"), ) .snapshot("suggests_columns_in_where_clause") .await; @@ -459,9 +459,6 @@ mod tests { "#; TestCompletionsSuite::new(&pool, Some(setup)) - .with_case( - TestCompletionsCase::new().type_sql("alter table instruments drop column name"), - ) .with_case( TestCompletionsCase::new().type_sql("alter table instruments drop column name"), ) diff --git a/crates/pgls_completions/src/providers/schemas.rs b/crates/pgls_completions/src/providers/schemas.rs index 410205f89..a2f263fe8 100644 --- a/crates/pgls_completions/src/providers/schemas.rs +++ b/crates/pgls_completions/src/providers/schemas.rs @@ -59,7 +59,8 @@ mod tests { assert_complete_results( format!("select * from {}", QueryWithCursorPosition::cursor_marker()).as_str(), vec![ - CompletionAssertion::LabelAndKind("public".to_string(), CompletionItemKind::Schema), + // users table still preferred over schemas + CompletionAssertion::LabelAndKind("users".to_string(), CompletionItemKind::Table), CompletionAssertion::LabelAndKind("auth".to_string(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind( "internal".to_string(), @@ -69,8 +70,7 @@ mod tests { "private".to_string(), CompletionItemKind::Schema, ), - // users table still preferred over system schemas - CompletionAssertion::LabelAndKind("users".to_string(), CompletionItemKind::Table), + // system schemas have lowest preference CompletionAssertion::LabelAndKind( "information_schema".to_string(), CompletionItemKind::Schema, @@ -110,8 +110,8 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), CompletionAssertion::LabelAndKind("ultimate".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), ], Some(setup), &pool, diff --git a/crates/pgls_completions/src/providers/tables.rs b/crates/pgls_completions/src/providers/tables.rs index ccfc66374..2068577fb 100644 --- a/crates/pgls_completions/src/providers/tables.rs +++ b/crates/pgls_completions/src/providers/tables.rs @@ -273,8 +273,8 @@ mod tests { assert_complete_results( format!("update {}", QueryWithCursorPosition::cursor_marker()).as_str(), vec![CompletionAssertion::LabelAndKind( - "public".into(), - CompletionItemKind::Schema, + "coos".into(), + CompletionItemKind::Table, )], None, &pool, @@ -354,10 +354,10 @@ mod tests { assert_complete_results( format!("delete from {}", QueryWithCursorPosition::cursor_marker()).as_str(), - vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), - CompletionAssertion::LabelAndKind("coos".into(), CompletionItemKind::Table), - ], + vec![CompletionAssertion::LabelAndKind( + "coos".into(), + CompletionItemKind::Table, + )], None, &pool, ) @@ -418,8 +418,13 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind( + "information_schema".into(), + CompletionItemKind::Schema, + ), + CompletionAssertion::LabelAndKind("pg_catalog".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind("pg_toast".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("posts".into(), CompletionItemKind::Table), // self-join CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), ], @@ -454,7 +459,6 @@ mod tests { assert_complete_results( format!("alter table {}", QueryWithCursorPosition::cursor_marker()).as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("posts".into(), CompletionItemKind::Table), CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), @@ -471,7 +475,6 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("posts".into(), CompletionItemKind::Table), CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), @@ -484,7 +487,6 @@ mod tests { assert_complete_results( format!("drop table {}", QueryWithCursorPosition::cursor_marker()).as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("posts".into(), CompletionItemKind::Table), CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), @@ -501,7 +503,6 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("posts".into(), CompletionItemKind::Table), // self-join CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), @@ -529,7 +530,6 @@ mod tests { assert_complete_results( format!("insert into {}", QueryWithCursorPosition::cursor_marker()).as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), ], @@ -561,7 +561,6 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("users".into(), CompletionItemKind::Table), ], @@ -686,8 +685,14 @@ mod tests { ) .as_str(), vec![ - CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), CompletionAssertion::LabelAndKind("auth".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind( + "information_schema".into(), + CompletionItemKind::Schema, + ), + CompletionAssertion::LabelAndKind("pg_catalog".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind("pg_toast".into(), CompletionItemKind::Schema), + CompletionAssertion::LabelAndKind("public".into(), CompletionItemKind::Schema), ], None, &pool, diff --git a/crates/pgls_completions/src/relevance/filtering.rs b/crates/pgls_completions/src/relevance/filtering.rs index 7aa3531a6..f273d0591 100644 --- a/crates/pgls_completions/src/relevance/filtering.rs +++ b/crates/pgls_completions/src/relevance/filtering.rs @@ -43,6 +43,10 @@ impl CompletionFilter<'_> { return None; } + if ctx.before_cursor_matches_kind(&["ERROR"]) { + return None; + } + // "literal" nodes can be identfiers wrapped in quotes: // `select "email" from auth.users;` // Here, "email" is a literal node. @@ -111,7 +115,8 @@ impl CompletionFilter<'_> { "column_reference_1of1", "column_reference_2of2", "column_reference_3of3", - ]) && !ctx.node_under_cursor_is_within_field(&["binary_expr_right"]) + ]) && (!ctx.node_under_cursor_is_within_field(&["binary_expr_right"]) + || ctx.has_any_qualifier()) } CompletionRelevanceData::Schema(_) => ctx.node_under_cursor_is_within_field(&[ @@ -138,17 +143,23 @@ impl CompletionFilter<'_> { ]) && matches!(f.kind, ProcKind::Aggregate)) } - CompletionRelevanceData::Table(_) => ctx.node_under_cursor_is_within_field(&[ - "object_reference_1of1", - "object_reference_1of2", - "object_reference_2of2", - "object_reference_2of3", - "table_reference_1of1", - "column_reference_1of1", - "column_reference_1of2", - "column_reference_2of2", - ]), - + CompletionRelevanceData::Table(_) => { + ctx.node_under_cursor_is_within_field(&[ + "object_reference_1of1", + "object_reference_1of2", + "object_reference_2of2", + "object_reference_2of3", + "table_reference_1of1", + "column_reference_1of1", + "column_reference_1of2", + "column_reference_2of2", + ]) && !ctx.history_ends_with(&[ + "update", + "assignment", + "column_reference", + "any_identifier", + ]) + } _ => false, }, @@ -164,7 +175,12 @@ impl CompletionFilter<'_> { .map(|clause| { match self.data { CompletionRelevanceData::Table(_) => match clause { - WrappingClause::From | WrappingClause::Update => true, + WrappingClause::From => true, + + WrappingClause::Update => ctx + .wrapping_node_kind + .as_ref() + .is_none_or(|n| n != &WrappingNode::Assignment), WrappingClause::RevokeStatement | WrappingClause::GrantStatement => ctx .history_ends_with(&[ diff --git a/crates/pgls_completions/src/relevance/scoring.rs b/crates/pgls_completions/src/relevance/scoring.rs index 68f157926..e4da05565 100644 --- a/crates/pgls_completions/src/relevance/scoring.rs +++ b/crates/pgls_completions/src/relevance/scoring.rs @@ -1,6 +1,6 @@ use fuzzy_matcher::{FuzzyMatcher, skim::SkimMatcherV2}; -use pgls_treesitter::context::{TreesitterContext, WrappingClause, WrappingNode}; +use pgls_treesitter::context::{TreesitterContext, WrappingClause}; use crate::sanitization; @@ -9,6 +9,7 @@ use super::CompletionRelevanceData; #[derive(Debug)] pub(crate) struct CompletionScore<'a> { score: i32, + skip: bool, data: CompletionRelevanceData<'a>, } @@ -16,12 +17,17 @@ impl<'a> From> for CompletionScore<'a> { fn from(value: CompletionRelevanceData<'a>) -> Self { Self { score: 0, + skip: false, data: value, } } } impl CompletionScore<'_> { + pub fn should_skip(&self) -> bool { + self.skip + } + pub fn get_score(&self) -> i32 { self.score } @@ -32,7 +38,7 @@ impl CompletionScore<'_> { self.check_matches_query_input(ctx); self.check_is_invocation(ctx); self.check_matching_clause_type(ctx); - self.check_matching_wrapping_node(ctx); + self.check_without_content(ctx); self.check_relations_in_stmt(ctx); self.check_columns_in_stmt(ctx); self.check_is_not_wellknown_migration(ctx); @@ -41,7 +47,9 @@ impl CompletionScore<'_> { fn check_matches_query_input(&mut self, ctx: &TreesitterContext) { let content = match ctx.get_node_under_cursor_content() { Some(c) if !sanitization::is_sanitized_token(c.as_str()) => c.replace('"', ""), - _ => return, + _ => { + return; + } }; let name = match self.data { @@ -55,20 +63,76 @@ impl CompletionScore<'_> { let fz_matcher = SkimMatcherV2::default(); - if let Some(score) = - fz_matcher.fuzzy_match(name.as_str(), content.to_ascii_lowercase().as_str()) - { - let scorei32: i32 = score - .try_into() - .expect("The length of the input exceeds i32 capacity"); - - // the scoring value isn't linear. - // here are a couple of samples: - // - item: bytea_string_agg_transfn, input: n, score: 15 - // - item: numeric_uplus, input: n, score: 31 - // - item: settings, input: sett, score: 91 - // - item: user_settings, input: sett, score: 82 - self.score += scorei32 / 2; + let check_against = match &ctx.identifier_qualifiers { + // If both qualifiers are already written out, we must check the item's name itself. + (Some(_), Some(_)) => name.clone(), + + // If only one qualifier is written out, we might look at a schema, a table, or an alias. + (None, Some(qualifier)) => { + if self.get_schema_name().is_some_and(|s| s == qualifier) { + self.get_table_name() + .map(|t| format!("{t}.{name}")) + .unwrap_or(name.clone()) + } else if self.get_table_name().is_some_and(|t| t == qualifier) { + name.clone() + } else if ctx + .get_mentioned_table_for_alias(qualifier) + .is_some_and(|alias_tbl| { + self.get_table_name() + .is_some_and(|item_tbl| alias_tbl == item_tbl) + }) + { + name.clone() + } else { + // the qualifier does not match schema, table, or alias. + // what the hell is it? + // probably a typo. + self.skip = true; + String::new() + } + } + + _ => match self.data { + // for columns and functions, we fuzzy match with a possible alias. + CompletionRelevanceData::Column(_) | CompletionRelevanceData::Policy(_) => self + .get_table_name() + .and_then(|tbl| ctx.get_used_alias_for_table(tbl)) + .map(|t| format!("{t}.{name}")) + .unwrap_or(name.clone()), + + // everything else is just fuzzy matched against its name. + _ => name.clone(), + }, + }; + + let content_lower = content.to_ascii_lowercase(); + let check_against_lower = check_against.to_ascii_lowercase(); + + match fz_matcher.fuzzy_match(check_against_lower.as_str(), content_lower.as_str()) { + Some(score) => { + let mut scorei32: i32 = score + .try_into() + .expect("The length of the input exceeds i32 capacity"); + + // give a significant bonus for prefix matches since these are much more + // likely what the user is looking for + if check_against_lower.starts_with(&content_lower) { + scorei32 += 20; + } + + // the scoring value isn't linear. + // here are a couple of samples: + // - item: bytea_string_agg_transfn, input: n, score: 15 + // - item: numeric_uplus, input: n, score: 31 + // - item: settings, input: sett, score: 91 + // - item: user_settings, input: sett, score: 82 + self.score += if check_against == name { + scorei32 / 2 + } else { + scorei32 / 3 + }; + } + None => self.skip = true, } } @@ -137,41 +201,49 @@ impl CompletionScore<'_> { } } - fn check_matching_wrapping_node(&mut self, ctx: &TreesitterContext) { - let wrapping_node = match ctx.wrapping_node_kind.as_ref() { - None => return, - Some(wn) => wn, - }; + // ok i think we need a rule set first. + // generally, we want to prefer columns that match a mentioned relation. that's already handled elsewhere. same with schema matches. - let has_qualifier = ctx.has_any_qualifier(); - let has_node_text = ctx + // so, what here? we want to handle the *no content* case. + // in that case, we want to check the current node_kind. + + fn check_without_content(&mut self, ctx: &TreesitterContext) { + // the function is only concerned with cases where the user hasn't typed anything yet. + if ctx .get_node_under_cursor_content() - .is_some_and(|txt| !sanitization::is_sanitized_token(txt.as_str())); + .is_some_and(|c| !sanitization::is_sanitized_token(c.as_str())) + { + return; + } - self.score += match self.data { - CompletionRelevanceData::Table(_) => match wrapping_node { - WrappingNode::Relation if has_qualifier => 15, - WrappingNode::Relation if !has_qualifier => 10, - WrappingNode::BinaryExpression => 5, - _ => -50, - }, - CompletionRelevanceData::Function(_) => match wrapping_node { - WrappingNode::BinaryExpression => 15, - WrappingNode::Relation => 10, - _ => -50, - }, - CompletionRelevanceData::Column(_) => match wrapping_node { - WrappingNode::BinaryExpression => 15, - WrappingNode::Assignment => 15, - _ => -15, - }, - CompletionRelevanceData::Schema(_) => match wrapping_node { - WrappingNode::Relation if !has_qualifier && !has_node_text => 15, - WrappingNode::Relation if !has_qualifier && has_node_text => 0, - _ => -50, + match ctx.node_under_cursor.kind() { + "function_identifier" | "table_identifier" + if self.get_schema_name().is_some_and(|s| s == "public") => + { + self.score += 10; + } + + "schema_identifier" if self.get_schema_name().is_some_and(|s| s != "public") => { + self.score += 10; + } + + "any_identifier" => match self.data { + CompletionRelevanceData::Table(table) => { + if table.schema == "public" { + self.score += 20; + } + } + CompletionRelevanceData::Schema(schema) => { + if schema.name != "public" { + self.score += 10; + } else { + self.score -= 20; + } + } + _ => {} }, - CompletionRelevanceData::Policy(_) => 0, - CompletionRelevanceData::Role(_) => 0, + + _ => (), } } @@ -237,6 +309,21 @@ impl CompletionScore<'_> { } } + fn get_fully_qualified_name(&self) -> String { + match self.data { + CompletionRelevanceData::Schema(s) => s.name.clone(), + CompletionRelevanceData::Column(c) => { + format!("{}.{}.{}", c.schema_name, c.table_name, c.name) + } + CompletionRelevanceData::Table(t) => format!("{}.{}", t.schema, t.name), + CompletionRelevanceData::Function(f) => format!("{}.{}", f.schema, f.name), + CompletionRelevanceData::Policy(p) => { + format!("{}.{}.{}", p.schema_name, p.table_name, p.name) + } + CompletionRelevanceData::Role(r) => r.name.clone(), + } + } + fn get_table_name(&self) -> Option<&str> { match self.data { CompletionRelevanceData::Column(c) => Some(c.table_name.as_str()), @@ -311,9 +398,16 @@ impl CompletionScore<'_> { } // "public" is the default postgres schema where users - // create objects. Prefer it by a slight bit. + // create objects. Prefer it by a slight bit, but do not suggest the literal one. if schema_name.as_str() == "public" { - self.score += 2; + match self.data { + CompletionRelevanceData::Schema(_) => { + self.score -= 2; + } + _ => { + self.score += 2; + } + } } let item_name = self.get_item_name().to_string(); diff --git a/crates/pgls_completions/src/sanitization.rs b/crates/pgls_completions/src/sanitization.rs index 045eaae65..2b10ee01d 100644 --- a/crates/pgls_completions/src/sanitization.rs +++ b/crates/pgls_completions/src/sanitization.rs @@ -26,7 +26,8 @@ pub(crate) fn remove_sanitized_token(it: &str) -> String { } pub(crate) fn is_sanitized_token(node_under_cursor_txt: &str) -> bool { - node_under_cursor_txt == SANITIZED_TOKEN || is_sanitized_token_with_quote(node_under_cursor_txt) + node_under_cursor_txt.replace('"', "") == SANITIZED_TOKEN + || is_sanitized_token_with_quote(node_under_cursor_txt) } pub(crate) fn is_sanitized_token_with_quote(node_under_cursor_txt: &str) -> bool { diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_in_join_on_clause.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_in_join_on_clause.snap index ed447c384..73e340190 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_in_join_on_clause.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_in_join_on_clause.snap @@ -52,24 +52,10 @@ select u.id, auth.posts.content from auth.users u join auth.posts p on p.u| Results: user_id - auth.posts.user_id (Column) -pid - auth.posts.pid (Column) -content - auth.posts.content (Column) -created_at - auth.posts.created_at (Column) -title - auth.posts.title (Column) -------------- select u.id, auth.posts.content from auth.users u join auth.posts p on p.user_id | - -Results: -p.pid - auth.posts.pid (Column) -u.uid - auth.users.uid (Column) -p.content - auth.posts.content (Column) -p.created_at - auth.posts.created_at (Column) -u.email - auth.users.email (Column) - --------------- - select u.id, auth.posts.content from auth.users u join auth.posts p on p.user_id = | Results: @@ -96,8 +82,6 @@ select u.id, auth.posts.content from auth.users u join auth.posts p on p.user_id Results: uid - auth.users.uid (Column) -email - auth.users.email (Column) -name - auth.users.name (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns.snap index 2cb3f114e..8ef51386a 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns.snap @@ -56,8 +56,8 @@ Results: email - private.users.email (Column) name - private.users.name (Column) quoted_column - private.users.quoted_column (Column) -id - private.users.id (Column) elem_count_histogram - pg_catalog.pg_stats.elem_count_histogram (Column) +encoding - pg_catalog.pg_database.encoding (Column) -------------- @@ -66,44 +66,44 @@ select "email" f| select "email" from | Results: -public - public (Schema) private - private (Schema) -private.users - private.users (Table) information_schema - information_schema (Schema) pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) +private.users - private.users (Table) -------------- select "email" from "| Results: -public - public (Schema) private - private (Schema) -private"."users" - private.users (Table) information_schema - information_schema (Schema) pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) +private"."users" - private.users (Table) -------------- select "email" from "|" Results: -public - public (Schema) private - private (Schema) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) private"."users - private.users (Table) -information_schema"."_pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema"."_pg_foreign_servers - information_schema._pg_foreign_servers (Table) -------------- select "email" from "p|" Results: -public - public (Schema) private - private (Schema) -private"."users - private.users (Table) +public - public (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) information_schema"."parameters - information_schema.parameters (Table) -pg_catalog"."pg_aggregate - pg_catalog.pg_aggregate (Table) -------------- @@ -115,10 +115,4 @@ users - private.users (Table) -------------- select "email" from "private".u| - -Results: -users - private.users (Table) - --------------- - select "email" from "private".users; | diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns_with_aliases.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns_with_aliases.snap index 53a0d60c6..a21fe79fe 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns_with_aliases.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__completes_quoted_columns_with_aliases.snap @@ -60,11 +60,11 @@ name - private.users.name (Column) select "p|" Results: -name - public.names.name (Column) -uid - public.names.uid (Column) -email - private.users.email (Column) -id - private.users.id (Column) -name - private.users.name (Column) +pad_attribute - information_schema.collations.pad_attribute (Column) +page - pg_catalog.pg_locks.page (Column) +pageno - pg_catalog.pg_largeobject.pageno (Column) +paracl - pg_catalog.pg_parameter_acl.paracl (Column) +parameter_default - information_schema.parameters.parameter_default (Column) -------------- @@ -77,21 +77,21 @@ select "pr"."email" f| select "pr"."email" from | Results: -public - public (Schema) -private - private (Schema) names - public.names (Table) -private.users - private.users (Table) +private - private (Schema) information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- select "pr"."email" from p| Results: -public - public (Schema) private - private (Schema) -names - public.names (Table) -private.users - private.users (Table) +public - public (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) information_schema.parameters - information_schema.parameters (Table) -------------- @@ -161,8 +161,8 @@ Results: pr"."email - private.users.email (Column) pr"."name - private.users.name (Column) pr"."quoted_column - private.users.quoted_column (Column) -pr"."id - private.users.id (Column) name - public.names.name (Column) +elem_count_histogram - pg_catalog.pg_stats.elem_count_histogram (Column) -------------- @@ -192,7 +192,7 @@ Results: "pr".id - private.users.id (Column) "pr".name - private.users.name (Column) "pr".quoted_column - private.users.quoted_column (Column) -name - public.names.name (Column) +pad_attribute - information_schema.collations.pad_attribute (Column) -------------- @@ -232,7 +232,6 @@ Results: email - private.users.email (Column) name - private.users.name (Column) quoted_column - private.users.quoted_column (Column) -id - private.users.id (Column) -------------- @@ -284,7 +283,7 @@ pr"."email - private.users.email (Column) pr"."id - private.users.id (Column) pr"."name - private.users.name (Column) pr"."quoted_column - private.users.quoted_column (Column) -name - public.names.name (Column) +pad_attribute - information_schema.collations.pad_attribute (Column) -------------- @@ -324,7 +323,6 @@ Results: email - private.users.email (Column) name - private.users.name (Column) quoted_column - private.users.quoted_column (Column) -id - private.users.id (Column) -------------- @@ -354,7 +352,7 @@ Results: "pr".id - private.users.id (Column) "pr".name - private.users.name (Column) "pr".quoted_column - private.users.quoted_column (Column) -name - public.names.name (Column) +pad_attribute - information_schema.collations.pad_attribute (Column) -------------- @@ -375,7 +373,6 @@ Results: email - private.users.email (Column) name - private.users.name (Column) quoted_column - private.users.quoted_column (Column) -id - private.users.id (Column) -------------- @@ -423,11 +420,11 @@ pr"."name - private.users.name (Column) select "p|" from private.users "pr" join public.names n on pr.id = n.uid; Results: -n"."name - public.names.name (Column) -n"."uid - public.names.uid (Column) pr"."email - private.users.email (Column) pr"."id - private.users.id (Column) pr"."name - private.users.name (Column) +pr"."quoted_column - private.users.quoted_column (Column) +pad_attribute - information_schema.collations.pad_attribute (Column) -------------- @@ -447,7 +444,6 @@ Results: email - private.users.email (Column) name - private.users.name (Column) quoted_column - private.users.quoted_column (Column) -id - private.users.id (Column) -------------- @@ -474,7 +470,6 @@ select "pr"."email", n.u| from private.users "pr" join public.names n on pr.id = Results: uid - public.names.uid (Column) -name - public.names.name (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__does_not_complete_cols_in_join_clauses.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__does_not_complete_cols_in_join_clauses.snap index 95f59dec2..629e98bc6 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__does_not_complete_cols_in_join_clauses.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__does_not_complete_cols_in_join_clauses.snap @@ -56,11 +56,11 @@ select u.uid, p.content from | **Schema suggestions should be prioritized, since we want to push users to specify them.** Results: -public - public (Schema) auth - auth (Schema) -auth.posts - auth.posts (Table) -auth.users - auth.users (Table) information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) +auth.posts - auth.posts (Table) -------------- @@ -69,10 +69,10 @@ select u.uid, p.content from a| Results: auth - auth (Schema) -public - public (Schema) -auth.posts - auth.posts (Table) -auth.users - auth.users (Table) information_schema.administrable_role_authorizations - information_schema.administrable_role_authorizations (Table) +information_schema.applicable_roles - information_schema.applicable_roles (Table) +information_schema.attributes - information_schema.attributes (Table) +information_schema - information_schema (Schema) -------------- @@ -90,7 +90,6 @@ select u.uid, p.content from auth.u| Results: users - auth.users (Table) -posts - auth.posts (Table) -------------- @@ -100,11 +99,11 @@ select u.uid, p.content from auth.users u j| select u.uid, p.content from auth.users u join | Results: -public - public (Schema) auth - auth (Schema) -auth.posts - auth.posts (Table) -auth.users - auth.users (Table) information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) +auth.posts - auth.posts (Table) -------------- @@ -112,10 +111,10 @@ select u.uid, p.content from auth.users u join a| Results: auth - auth (Schema) -public - public (Schema) -auth.posts - auth.posts (Table) -auth.users - auth.users (Table) information_schema.administrable_role_authorizations - information_schema.administrable_role_authorizations (Table) +information_schema.applicable_roles - information_schema.applicable_roles (Table) +information_schema.attributes - information_schema.attributes (Table) +information_schema - information_schema (Schema) -------------- @@ -131,7 +130,6 @@ select u.uid, p.content from auth.users u join auth.p| Results: posts - auth.posts (Table) -users - auth.users (Table) -------------- @@ -162,22 +160,10 @@ select u.uid, p.content from auth.users u join auth.posts p on u.u| Results: uid - auth.users.uid (Column) -email - auth.users.email (Column) -name - auth.users.name (Column) -------------- select u.uid, p.content from auth.users u join auth.posts p on u.uid | - -Results: -p.pid - auth.posts.pid (Column) -u.uid - auth.users.uid (Column) -p.content - auth.posts.content (Column) -p.created_at - auth.posts.created_at (Column) -u.email - auth.users.email (Column) - --------------- - select u.uid, p.content from auth.users u join auth.posts p on u.uid = | Results: @@ -204,20 +190,7 @@ select u.uid, p.content from auth.users u join auth.posts p on u.uid = p.u| Results: user_id - auth.posts.user_id (Column) -pid - auth.posts.pid (Column) -content - auth.posts.content (Column) -created_at - auth.posts.created_at (Column) -title - auth.posts.title (Column) -------------- select u.uid, p.content from auth.users u join auth.posts p on u.uid = p.user_id | - -Results: -p.pid - auth.posts.pid (Column) -u.uid - auth.users.uid (Column) -p.content - auth.posts.content (Column) -p.created_at - auth.posts.created_at (Column) -u.email - auth.users.email (Column) - --------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_join_on.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_join_on.snap index 8adcb3f56..37c635810 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_join_on.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_join_on.snap @@ -51,21 +51,10 @@ select u.id, p.content from auth.users u join auth.posts p on u.i| Results: uid - auth.users.uid (Column) email - auth.users.email (Column) -name - auth.users.name (Column) -------------- select u.id, p.content from auth.users u join auth.posts p on u.id | - -Results: -p.pid - auth.posts.pid (Column) -u.uid - auth.users.uid (Column) -p.content - auth.posts.content (Column) -p.created_at - auth.posts.created_at (Column) -u.email - auth.users.email (Column) - --------------- - select u.id, p.content from auth.users u join auth.posts p on u.id = | Results: @@ -93,20 +82,7 @@ select u.id, p.content from auth.users u join auth.posts p on u.id = p.u| Results: user_id - auth.posts.user_id (Column) -pid - auth.posts.pid (Column) -content - auth.posts.content (Column) -created_at - auth.posts.created_at (Column) -title - auth.posts.title (Column) -------------- select u.id, p.content from auth.users u join auth.posts p on u.id = p.user_id | - -Results: -p.pid - auth.posts.pid (Column) -u.uid - auth.users.uid (Column) -p.content - auth.posts.content (Column) -p.created_at - auth.posts.created_at (Column) -u.email - auth.users.email (Column) - --------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_select.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_select.snap index 581ff6cdb..0a80debe3 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_select.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__filters_out_by_aliases_in_select.snap @@ -49,7 +49,6 @@ select u.i| from auth.users u join auth.posts p on u.id = p.user_id; Results: email - auth.users.email (Column) uid - auth.users.uid (Column) -name - auth.users.name (Column) -------------- @@ -81,10 +80,6 @@ select u.id, p.p| from auth.users u join auth.posts p on u.id = p.user_id; Results: pid - auth.posts.pid (Column) -content - auth.posts.content (Column) -created_at - auth.posts.created_at (Column) -title - auth.posts.title (Column) -user_id - auth.posts.user_id (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__handles_nested_queries.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__handles_nested_queries.snap index 9f0fcc088..0d203a4c1 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__handles_nested_queries.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__handles_nested_queries.snap @@ -25,161 +25,79 @@ create table private.audio_books ( -------------- select * from ( - | + | from private.audio_books ) as subquery join public.users u on u.id = subquery.id; - -Results: -audio_books - public.audio_books (Table) -users - public.users (Table) -private.audio_books - private.audio_books (Table) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) - --------------- - select * from ( - s| + s| from private.audio_books ) as subquery join public.users u on u.id = subquery.id; - -Results: -audio_books - public.audio_books (Table) -users - public.users (Table) -private.audio_books - private.audio_books (Table) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) - --------------- - select * from ( - select | + select | from private.audio_books ) as subquery join public.users u on u.id = subquery.id; Results: -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) -pg_catalog.RI_FKey_check_upd() - Schema: pg_catalog.RI_FKey_check_upd (Function) -pg_catalog.RI_FKey_noaction_del() - Schema: pg_catalog.RI_FKey_noaction_del (Function) +id - private.audio_books.id (Column) +narrator_id - private.audio_books.narrator_id (Column) +id - public.audio_books.id (Column) +name - public.users.name (Column) +narrator - public.audio_books.narrator (Column) -------------- select * from ( - select i| + select i| from private.audio_books ) as subquery join public.users u on u.id = subquery.id; Results: -iclikejoinsel - Schema: pg_catalog.iclikejoinsel (Function) -iclikesel - Schema: pg_catalog.iclikesel (Function) -icnlikejoinsel - Schema: pg_catalog.icnlikejoinsel (Function) -icnlikesel - Schema: pg_catalog.icnlikesel (Function) -icregexeqjoinsel - Schema: pg_catalog.icregexeqjoinsel (Function) +id - private.audio_books.id (Column) +narrator_id - private.audio_books.narrator_id (Column) +id - public.audio_books.id (Column) +ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) -------------- select * from ( - select id, | + select id, | from private.audio_books ) as subquery join public.users u on u.id = subquery.id; **Should prefer the one from private.audio_audiobooks, since the other tables are out of scope.** Results: -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) -pg_catalog.RI_FKey_check_upd() - Schema: pg_catalog.RI_FKey_check_upd (Function) -pg_catalog.RI_FKey_noaction_del() - Schema: pg_catalog.RI_FKey_noaction_del (Function) +narrator_id - private.audio_books.narrator_id (Column) +id - private.audio_books.id (Column) +name - public.users.name (Column) +narrator - public.audio_books.narrator (Column) +id - public.audio_books.id (Column) -------------- select * from ( - select id, n| + select id, n| from private.audio_books ) as subquery join public.users u on u.id = subquery.id; **Should prefer the one from private.audio_audiobooks, since the other tables are out of scope.** Results: -name - Schema: pg_catalog.name (Function) -nameconcatoid - Schema: pg_catalog.nameconcatoid (Function) -nameeq - Schema: pg_catalog.nameeq (Function) -nameeqtext - Schema: pg_catalog.nameeqtext (Function) -namege - Schema: pg_catalog.namege (Function) - --------------- - -select * from ( - select id, narrator_id | -) as subquery -join public.users u -on u.id = subquery.id; -select * from ( - select id, narrator_id f| -) as subquery -join public.users u -on u.id = subquery.id; -select * from ( - select id, narrator_id from | -) as subquery -join public.users u -on u.id = subquery.id; - -Results: -public - public (Schema) -private - private (Schema) -audio_books - public.audio_books (Table) -users - public.users (Table) -private.audio_books - private.audio_books (Table) - --------------- - -select * from ( - select id, narrator_id from p| -) as subquery -join public.users u -on u.id = subquery.id; - -Results: -public - public (Schema) -private - private (Schema) -audio_books - public.audio_books (Table) -users - public.users (Table) -private.audio_books - private.audio_books (Table) - --------------- - -select * from ( - select id, narrator_id from private.| -) as subquery -join public.users u -on u.id = subquery.id; - -Results: -audio_books - private.audio_books (Table) - --------------- - -select * from ( - select id, narrator_id from private.a| -) as subquery -join public.users u -on u.id = subquery.id; - -Results: -audio_books - private.audio_books (Table) +narrator_id - private.audio_books.narrator_id (Column) +name - public.users.name (Column) +narrator - public.audio_books.narrator (Column) +n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) -------------- select * from ( - select id, narrator_id from private.audio_books | + select id, narrator_id | from private.audio_books ) as subquery join public.users u on u.id = subquery.id; diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__ignores_cols_in_from_clause.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__ignores_cols_in_from_clause.snap index 8c8b135a9..a6c1b9f57 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__ignores_cols_in_from_clause.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__ignores_cols_in_from_clause.snap @@ -21,11 +21,11 @@ select * from | **No column suggestions.** Results: -public - public (Schema) private - private (Schema) -private.users - private.users (Table) information_schema - information_schema (Schema) pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) +private.users - private.users (Table) -------------- @@ -33,11 +33,11 @@ select * from p| **No column suggestions.** Results: -public - public (Schema) private - private (Schema) -private.users - private.users (Table) +public - public (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) information_schema.parameters - information_schema.parameters (Table) -pg_catalog.pg_aggregate - pg_catalog.pg_aggregate (Table) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_columns_of_mentioned_tables.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_columns_of_mentioned_tables.snap index 490549e94..ca024d628 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_columns_of_mentioned_tables.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_columns_of_mentioned_tables.snap @@ -47,8 +47,8 @@ Results: address2 - public.users.address2 (Column) email2 - public.users.email2 (Column) name2 - public.users.name2 (Column) -id2 - public.users.id2 (Column) -settings - public.users.settings (Column) +address1 - private.users.address1 (Column) +email1 - private.users.email1 (Column) -------------- @@ -79,8 +79,8 @@ Results: address1 - private.users.address1 (Column) email1 - private.users.email1 (Column) name1 - private.users.name1 (Column) -id1 - private.users.id1 (Column) -user_settings - private.users.user_settings (Column) +address2 - public.users.address2 (Column) +email2 - public.users.email2 (Column) -------------- @@ -110,9 +110,9 @@ select s| from private.users Results: user_settings - private.users.user_settings (Column) address1 - private.users.address1 (Column) -email1 - private.users.email1 (Column) -id1 - private.users.id1 (Column) -name1 - private.users.name1 (Column) +settings - public.users.settings (Column) +address2 - public.users.address2 (Column) +safe_wal_size - pg_catalog.pg_replication_slots.safe_wal_size (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_not_mentioned_columns.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_not_mentioned_columns.snap index cfd1f380a..9ccf98a9a 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_not_mentioned_columns.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__prefers_not_mentioned_columns.snap @@ -51,9 +51,6 @@ select o.i| from public.one o join public.two on o.id = t.id; Results: id - public.one.id (Column) -a - public.one.a (Column) -b - public.one.b (Column) -z - public.one.z (Column) -------------- @@ -72,10 +69,10 @@ select o.id, a| from public.one o join public.two on o.id = t.id; Results: o.a - public.one.a (Column) -o.b - public.one.b (Column) -c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) +abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) +action_condition - information_schema.triggers.action_condition (Column) +action_order - information_schema.triggers.action_order (Column) +action_orientation - information_schema.triggers.action_orientation (Column) -------------- @@ -95,10 +92,10 @@ select o.id, a, b| from public.one o join public.two on o.id = t.id; Results: o.b - public.one.b (Column) -c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) -id - public.two.id (Column) +backend_start - pg_catalog.pg_stat_activity.backend_start (Column) +backend_type - pg_catalog.pg_stat_activity.backend_type (Column) +backend_xid - pg_catalog.pg_stat_activity.backend_xid (Column) +backend_xmin - pg_catalog.pg_stat_activity.backend_xmin (Column) -------------- @@ -117,10 +114,10 @@ select o.id, a, b, c| from public.one o join public.two on o.id = t.id; Results: c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) -id - public.two.id (Column) -o.z - public.one.z (Column) +cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -138,11 +135,11 @@ o.a - public.one.a (Column) select o.id, a, b, c, d| from public.one o join public.two on o.id = t.id; Results: -id - public.two.id (Column) d - public.two.d (Column) -e - public.two.e (Column) -o.z - public.one.z (Column) -o.id - public.one.id (Column) +id - public.two.id (Column) +data - pg_catalog.pg_largeobject.data (Column) +data_type - pg_catalog.pg_sequences.data_type (Column) +database - pg_catalog.pg_hba_file_rules.database (Column) -------------- @@ -161,10 +158,10 @@ select o.id, a, b, c, d, e| from public.one o join public.two on o.id = t.id; Results: e - public.two.e (Column) -id - public.two.id (Column) -o.z - public.one.z (Column) -o.a - public.one.a (Column) -o.b - public.one.b (Column) +elem_count_histogram - pg_catalog.pg_stats.elem_count_histogram (Column) +encoding - pg_catalog.pg_database.encoding (Column) +encrypted - pg_catalog.pg_stat_gssapi.encrypted (Column) +enforced - information_schema.table_constraints.enforced (Column) -------------- @@ -202,11 +199,11 @@ e - public.two.e (Column) select i| from public.one o join public.two on o.id = t.id; Results: -o.id - public.one.id (Column) -o.a - public.one.a (Column) -o.b - public.one.b (Column) -c - public.two.c (Column) -d - public.two.d (Column) +id - public.two.id (Column) +ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- @@ -225,10 +222,10 @@ select id, a| from public.one o join public.two on o.id = t.id; Results: o.a - public.one.a (Column) -o.b - public.one.b (Column) -c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) +abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) +action_condition - information_schema.triggers.action_condition (Column) +action_order - information_schema.triggers.action_order (Column) +action_orientation - information_schema.triggers.action_orientation (Column) -------------- @@ -247,10 +244,10 @@ select id, a, b| from public.one o join public.two on o.id = t.id; Results: o.b - public.one.b (Column) -c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) -o.z - public.one.z (Column) +backend_start - pg_catalog.pg_stat_activity.backend_start (Column) +backend_type - pg_catalog.pg_stat_activity.backend_type (Column) +backend_xid - pg_catalog.pg_stat_activity.backend_xid (Column) +backend_xmin - pg_catalog.pg_stat_activity.backend_xmin (Column) -------------- @@ -269,10 +266,10 @@ select id, a, b, c| from public.one o join public.two on o.id = t.id; Results: c - public.two.c (Column) -d - public.two.d (Column) -e - public.two.e (Column) -o.z - public.one.z (Column) -o.a - public.one.a (Column) +cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -291,10 +288,10 @@ select id, a, b, c, d| from public.one o join public.two on o.id = t.id; Results: d - public.two.d (Column) -e - public.two.e (Column) -o.z - public.one.z (Column) -o.id - public.one.id (Column) -o.a - public.one.a (Column) +id - public.two.id (Column) +data - pg_catalog.pg_largeobject.data (Column) +data_type - pg_catalog.pg_sequences.data_type (Column) +database - pg_catalog.pg_hba_file_rules.database (Column) -------------- @@ -313,10 +310,10 @@ select id, a, b, c, d, e| from public.one o join public.two on o.id = t.id; Results: e - public.two.e (Column) -o.z - public.one.z (Column) -o.a - public.one.a (Column) -o.b - public.one.b (Column) -c - public.two.c (Column) +elem_count_histogram - pg_catalog.pg_stats.elem_count_histogram (Column) +encoding - pg_catalog.pg_database.encoding (Column) +encrypted - pg_catalog.pg_stat_gssapi.encrypted (Column) +enforced - information_schema.table_constraints.enforced (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__shows_multiple_columns_if_no_relation_specified.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__shows_multiple_columns_if_no_relation_specified.snap index 71823a4b6..463bca8f4 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__shows_multiple_columns_if_no_relation_specified.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__shows_multiple_columns_if_no_relation_specified.snap @@ -44,8 +44,8 @@ Results: name - public.users.name (Column) narrator - public.audio_books.narrator (Column) narrator_id - private.audio_books.narrator_id (Column) -id - public.audio_books.id (Column) name - Schema: pg_catalog.name (Function) +nameconcatoid - Schema: pg_catalog.nameconcatoid (Function) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_alter_table_and_drop_table.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_alter_table_and_drop_table.snap index e8af8cac0..76dc39d7e 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_alter_table_and_drop_table.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_alter_table_and_drop_table.snap @@ -23,10 +23,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -34,9 +34,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -58,10 +58,10 @@ alter table instruments drop c| Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -80,10 +80,10 @@ alter table instruments drop column n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -101,88 +101,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) - --------------- - -alter table i| - -Results: -instruments - public.instruments (Table) -public - public (Schema) +_sqlx_migrations - public._sqlx_migrations (Table) information_schema - information_schema (Schema) -information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) -pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) - --------------- - -alter table instruments | -alter table instruments d| -alter table instruments drop | - -Results: -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) - --------------- - -alter table instruments drop c| - -Results: -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -cache_size - pg_catalog.pg_sequences.cache_size (Column) - --------------- - -alter table instruments drop column | - -Results: -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) - --------------- - -alter table instruments drop column n| - -Results: -name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) -n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) - --------------- - -alter table instruments drop column name | - - - - -***Case 3:*** - -a| -alter | -alter t| -alter table | - -Results: -instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -190,9 +112,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -214,10 +136,10 @@ alter table instruments drop c| Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -236,35 +158,15 @@ alter table instruments drop column i| Results: id - public.instruments.id (Column) -created_at - public.instruments.created_at (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- alter table instruments drop column if | - -Results: -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) - --------------- - alter table instruments drop column if e| - -Results: -created_at - public.instruments.created_at (Column) -name - public.instruments.name (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) -elem_count_histogram - pg_catalog.pg_stats.elem_count_histogram (Column) - --------------- - alter table instruments drop column if exists | Results: @@ -280,10 +182,10 @@ alter table instruments drop column if exists n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -292,7 +194,7 @@ alter table instruments drop column if exists name | -***Case 4:*** +***Case 3:*** a| alter | @@ -301,10 +203,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -312,9 +214,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -336,10 +238,10 @@ alter table instruments alter c| Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -358,10 +260,10 @@ alter table instruments alter column n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -376,7 +278,7 @@ created_at - public.instruments.created_at (Column) id - public.instruments.id (Column) name - public.instruments.name (Column) z - public.instruments.z (Column) -abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) +instruments - public.instruments (Table) -------------- @@ -384,7 +286,7 @@ abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) -***Case 5:*** +***Case 4:*** a| alter | @@ -393,10 +295,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -404,9 +306,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -428,10 +330,10 @@ alter table instruments alter n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -446,7 +348,7 @@ created_at - public.instruments.created_at (Column) id - public.instruments.id (Column) name - public.instruments.name (Column) z - public.instruments.z (Column) -abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) +instruments - public.instruments (Table) -------------- @@ -454,7 +356,7 @@ abbrev - pg_catalog.pg_timezone_abbrevs.abbrev (Column) -***Case 6:*** +***Case 5:*** a| alter | @@ -463,10 +365,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -474,10 +376,10 @@ alter table p| Results: public - public (Schema) -instruments - public.instruments (Table) information_schema.parameters - information_schema.parameters (Table) pg_catalog.pg_aggregate - pg_catalog.pg_aggregate (Table) pg_catalog.pg_am - pg_catalog.pg_am (Table) +pg_catalog.pg_amop - pg_catalog.pg_amop (Table) -------------- @@ -514,10 +416,10 @@ alter table public.instruments alter c| Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -536,10 +438,10 @@ alter table public.instruments alter column n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -548,7 +450,7 @@ alter table public.instruments alter column name | -***Case 7:*** +***Case 6:*** a| alter | @@ -557,10 +459,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -568,9 +470,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -592,10 +494,10 @@ alter table instruments alter n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -604,7 +506,7 @@ alter table instruments alter name | -***Case 8:*** +***Case 7:*** a| alter | @@ -613,10 +515,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -624,9 +526,9 @@ alter table i| Results: instruments - public.instruments (Table) -public - public (Schema) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -648,10 +550,10 @@ alter table instruments rename n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -664,7 +566,7 @@ alter table instruments rename name to new_col | -***Case 9:*** +***Case 8:*** a| alter | @@ -673,10 +575,10 @@ alter table | Results: instruments - public.instruments (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) -information_schema._pg_foreign_table_columns - information_schema._pg_foreign_table_columns (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) +pg_toast - pg_toast (Schema) -------------- @@ -684,10 +586,10 @@ alter table p| Results: public - public (Schema) -instruments - public.instruments (Table) information_schema.parameters - information_schema.parameters (Table) pg_catalog.pg_aggregate - pg_catalog.pg_aggregate (Table) pg_catalog.pg_am - pg_catalog.pg_am (Table) +pg_catalog.pg_amop - pg_catalog.pg_amop (Table) -------------- @@ -724,10 +626,10 @@ alter table public.instruments rename c| Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -746,10 +648,10 @@ alter table public.instruments rename column n| Results: name - public.instruments.name (Column) -created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_insert_clause.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_insert_clause.snap index 0d99a891f..0d300f984 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_insert_clause.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_insert_clause.snap @@ -29,9 +29,9 @@ insert into | Results: instruments - public.instruments (Table) others - public.others (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) -------------- @@ -39,10 +39,10 @@ insert into i| Results: instruments - public.instruments (Table) -public - public (Schema) -others - public.others (Table) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) +pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -63,10 +63,10 @@ insert into instruments (i|) Results: id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -id - public.others.id (Column) -a - public.others.a (Column) +ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- @@ -85,10 +85,10 @@ insert into instruments (id, n|) Results: name - public.instruments.name (Column) -z - public.instruments.z (Column) -id - public.instruments.id (Column) -a - public.others.a (Column) -b - public.others.b (Column) +n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -135,9 +135,9 @@ insert into | Results: instruments - public.instruments (Table) others - public.others (Table) -public - public (Schema) -information_schema._pg_foreign_data_wrappers - information_schema._pg_foreign_data_wrappers (Table) -information_schema._pg_foreign_servers - information_schema._pg_foreign_servers (Table) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) -------------- @@ -145,10 +145,10 @@ insert into i| Results: instruments - public.instruments (Table) -public - public (Schema) -others - public.others (Table) information_schema - information_schema (Schema) information_schema.information_schema_catalog_name - information_schema.information_schema_catalog_name (Table) +public - public (Schema) +pg_catalog.pg_ident_file_mappings - pg_catalog.pg_ident_file_mappings (Table) -------------- @@ -169,10 +169,10 @@ insert into instruments (i|) Results: id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) -id - public.others.id (Column) -a - public.others.a (Column) +ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- @@ -213,10 +213,10 @@ insert into instruments ("id", "n|") Results: name - public.instruments.name (Column) -id - public.instruments.id (Column) -z - public.instruments.z (Column) -a - public.others.a (Column) -b - public.others.b (Column) +n_dead_tup - pg_catalog.pg_stat_all_tables.n_dead_tup (Column) +n_distinct - pg_catalog.pg_stats.n_distinct (Column) +n_ins_since_vacuum - pg_catalog.pg_stat_all_tables.n_ins_since_vacuum (Column) +n_live_tup - pg_catalog.pg_stat_all_tables.n_live_tup (Column) -------------- @@ -267,6 +267,16 @@ b - public.others.b (Column) -------------- insert into instruments (i|, name) values ('my_bass'); + +Results: +id - public.instruments.id (Column) +ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) + +-------------- + insert into instruments (id, |, name) values ('my_bass'); **`name` is already written, so z should be suggested.** diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_where_clause.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_where_clause.snap index 90022579d..a291aad9e 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_where_clause.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_in_where_clause.snap @@ -21,27 +21,7 @@ create table others ( -------------- select name from instruments i join others o on i.z = o.a | - -Results: -i.id - public.instruments.id (Column) -o.a - public.others.a (Column) -o.b - public.others.b (Column) -o.c - public.others.c (Column) -i.created_at - public.instruments.created_at (Column) - --------------- - select name from instruments i join others o on i.z = o.a w| - -Results: -i.id - public.instruments.id (Column) -o.a - public.others.a (Column) -o.b - public.others.b (Column) -o.c - public.others.c (Column) -i.created_at - public.instruments.created_at (Column) - --------------- - select name from instruments i join others o on i.z = o.a where | Results: @@ -64,51 +44,30 @@ c - public.others.c (Column) -------------- select name from instruments i join others o on i.z = o.a where o.a | - -Results: -o.a - public.others.a (Column) -o.b - public.others.b (Column) -o.c - public.others.c (Column) -i.created_at - public.instruments.created_at (Column) -i.id - public.instruments.id (Column) - --------------- - select name from instruments i join others o on i.z = o.a where o.a = | **should not prioritize suggest columns or schemas (right side of binary expression)** Results: instruments - public.instruments (Table) others - public.others (Table) -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) -------------- select name from instruments i join others o on i.z = o.a where o.a = i.| -select name from instruments i join others o on i.z = o.a where o.a = i.z | Results: -instruments - public.instruments (Table) -others - public.others (Table) -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) +created_at - public.instruments.created_at (Column) +id - public.instruments.id (Column) +name - public.instruments.name (Column) +z - public.instruments.z (Column) -------------- +select name from instruments i join others o on i.z = o.a where o.a = i.z | select name from instruments i join others o on i.z = o.a where o.a = i.z a| - -Results: -instruments - public.instruments (Table) -others - public.others (Table) -abbrev - Schema: pg_catalog.abbrev (Function) -abs - Schema: pg_catalog.abs (Function) -aclcontains - Schema: pg_catalog.aclcontains (Function) - --------------- - select name from instruments i join others o on i.z = o.a where o.a = i.z and | **should prioritize columns that aren't already mentioned** @@ -122,26 +81,31 @@ i.name - public.instruments.name (Column) -------------- select name from instruments i join others o on i.z = o.a where o.a = i.z and i.| + +Results: +created_at - public.instruments.created_at (Column) +id - public.instruments.id (Column) +name - public.instruments.name (Column) +z - public.instruments.z (Column) + +-------------- + select name from instruments i join others o on i.z = o.a where o.a = i.z and i.i| -select name from instruments i join others o on i.z = o.a where o.a = i.z and i.id | Results: -instruments - public.instruments (Table) -others - public.others (Table) -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) +id - public.instruments.id (Column) -------------- +select name from instruments i join others o on i.z = o.a where o.a = i.z and i.id | select name from instruments i join others o on i.z = o.a where o.a = i.z and i.id > | Results: instruments - public.instruments (Table) others - public.others (Table) -pg_catalog.RI_FKey_cascade_del() - Schema: pg_catalog.RI_FKey_cascade_del (Function) -pg_catalog.RI_FKey_cascade_upd() - Schema: pg_catalog.RI_FKey_cascade_upd (Function) -pg_catalog.RI_FKey_check_ins() - Schema: pg_catalog.RI_FKey_check_ins (Function) +_sqlx_migrations - public._sqlx_migrations (Table) +information_schema - information_schema (Schema) +pg_catalog - pg_catalog (Schema) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_policy_using_clause.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_policy_using_clause.snap index 1f04bb0f8..d3db86856 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_policy_using_clause.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_columns_policy_using_clause.snap @@ -31,10 +31,10 @@ create policy "my_pol" on public.instruments for select using (i|) Results: id - public.instruments.id (Column) -created_at - public.instruments.created_at (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- @@ -67,10 +67,10 @@ create policy "my_pol" on public.instruments for select using (id = 1 and c|) Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- @@ -99,10 +99,10 @@ create policy "my_pol" on public.instruments for insert with check (i|) Results: id - public.instruments.id (Column) -created_at - public.instruments.created_at (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) ident - pg_catalog.pg_backend_memory_contexts.ident (Column) +identity_cycle - information_schema.columns.identity_cycle (Column) +identity_generation - information_schema.columns.identity_generation (Column) +identity_increment - information_schema.columns.identity_increment (Column) -------------- @@ -135,10 +135,10 @@ create policy "my_pol" on public.instruments for insert with check (id = 1 and c Results: created_at - public.instruments.created_at (Column) -id - public.instruments.id (Column) -name - public.instruments.name (Column) -z - public.instruments.z (Column) cache_size - pg_catalog.pg_sequences.cache_size (Column) +calls - pg_catalog.pg_stat_user_functions.calls (Column) +castcontext - pg_catalog.pg_cast.castcontext (Column) +castfunc - pg_catalog.pg_cast.castfunc (Column) -------------- diff --git a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_relevant_columns_without_letters.snap b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_relevant_columns_without_letters.snap index 12dcca6a4..758932c93 100644 --- a/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_relevant_columns_without_letters.snap +++ b/crates/pgls_completions/src/snapshots/pgls_completions__test_helper__suggests_relevant_columns_without_letters.snap @@ -30,10 +30,10 @@ select n| Results: name - public.users.name (Column) -address - public.users.address (Column) -email - public.users.email (Column) -id - public.users.id (Column) -name - Schema: pg_catalog.name (Function) +nameconcatoid - Schema: pg_catalog.nameconcatoid (Function) +nameeq - Schema: pg_catalog.nameeq (Function) +nameeqtext - Schema: pg_catalog.nameeqtext (Function) +namege - Schema: pg_catalog.namege (Function) -------------- @@ -42,11 +42,11 @@ select name f| select name from | Results: -public - public (Schema) users - public.users (Table) information_schema - information_schema (Schema) pg_catalog - pg_catalog (Schema) pg_toast - pg_toast (Schema) +_sqlx_migrations - public._sqlx_migrations (Table) -------------- diff --git a/crates/pgls_treesitter/src/context/mod.rs b/crates/pgls_treesitter/src/context/mod.rs index d61fac7fe..2761d32da 100644 --- a/crates/pgls_treesitter/src/context/mod.rs +++ b/crates/pgls_treesitter/src/context/mod.rs @@ -268,14 +268,14 @@ impl<'a> TreesitterContext<'a> { if chars .nth(self.position) - .is_some_and(|c| !c.is_ascii_whitespace() && !&[';', ')'].contains(&c)) + .is_some_and(|c| c.is_ascii_whitespace() || [';', ')', ',', '('].contains(&c)) { - self.position = cmp::min(self.position, self.text.len().saturating_sub(1)); - } else { self.position = cmp::min( self.position.saturating_sub(1), self.text.len().saturating_sub(1), ); + } else { + self.position = cmp::min(self.position, self.text.len().saturating_sub(1)); } cursor.goto_first_child_for_byte(self.position); @@ -357,6 +357,10 @@ impl<'a> TreesitterContext<'a> { } } + "insert_columns" => { + self.wrapping_node_kind = Some(WrappingNode::List); + } + _ => { if let Some(clause_type) = self.get_wrapping_clause_from_current_node(current_node, &mut cursor) @@ -620,8 +624,8 @@ impl<'a> TreesitterContext<'a> { /// Verifies whether the node_under_cursor has the passed in ancestors in the right order. /// Note that you need to pass in the ancestors in the order as they would appear in the tree: /// - /// If the tree shows `relation > object_reference > any_identifier` and the "any_identifier" is a leaf node, - /// you need to pass `&["relation", "object_reference"]`. + /// If the tree shows `relation > object_reference > any_identifier` + /// you need to pass `&["relation", "object_reference", "any_identifier"]`. pub fn history_ends_with(&self, expected_ancestors: &[&'static str]) -> bool { self.scope_tracker .current() @@ -1094,4 +1098,58 @@ mod tests { // should simply not panic let _ = TreesitterContext::new(params); } + + #[test] + fn corrects_the_position_accordingly() { + let query = "select id, email from some_foo(param1, param2);"; + // 01234567890123456789012345678901234567890123456 + // 0 10 20 30 40 + + let tree = get_tree(query); + + struct TestCase { + cursor_position: u32, + context_position: usize, + } + + let cases: Vec = vec![ + TestCase { + // moves from ',' to 'l' of 'email' + cursor_position: 9, + context_position: 8, + }, + TestCase { + // stays on 'e' of 'email' + cursor_position: 11, + context_position: 11, + }, + TestCase { + // moves from '(' to 'o' of 'some_foo' + cursor_position: 30, + context_position: 29, + }, + TestCase { + // moves from ')' to '2' of 'param2' + cursor_position: 45, + context_position: 44, + }, + ]; + + for case in cases { + let params = TreeSitterContextParams { + position: case.cursor_position.into(), + text: query, + tree: &tree, + }; + + // should simply not panic + let ctx = TreesitterContext::new(params); + + assert_eq!( + ctx.position, case.context_position, + "received {} but expected {}", + ctx.position, case.context_position + ); + } + } } diff --git a/crates/pgls_treesitter_grammar/grammar.js b/crates/pgls_treesitter_grammar/grammar.js index 8a1f91c52..1b2a0e3df 100644 --- a/crates/pgls_treesitter_grammar/grammar.js +++ b/crates/pgls_treesitter_grammar/grammar.js @@ -2241,8 +2241,6 @@ module.exports = grammar({ ) ), - assignment_list: ($) => seq($.assignment, repeat(seq(",", $.assignment))), - _set_values: ($) => seq($.keyword_set, comma_list($.assignment, true)), _column_list: ($) => paren_list(alias($._column, $.column), true), diff --git a/crates/pgls_treesitter_grammar/src/grammar.json b/crates/pgls_treesitter_grammar/src/grammar.json index 683c519ec..600f9a3e0 100644 --- a/crates/pgls_treesitter_grammar/src/grammar.json +++ b/crates/pgls_treesitter_grammar/src/grammar.json @@ -13838,31 +13838,6 @@ } ] }, - "assignment_list": { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "assignment" - }, - { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "SYMBOL", - "name": "assignment" - } - ] - } - } - ] - }, "_set_values": { "type": "SEQ", "members": [ diff --git a/packages/@postgres-language-server/cli/test/bin.test.js b/packages/@postgres-language-server/cli/test/bin.test.js index 921869e53..7c743e629 100644 --- a/packages/@postgres-language-server/cli/test/bin.test.js +++ b/packages/@postgres-language-server/cli/test/bin.test.js @@ -8,12 +8,15 @@ const binPath = join(__dirname, "../bin/postgres-language-server"); const testSqlPath = join(__dirname, "test.sql"); describe("postgres-language-server bin", () => { - it("should check a SQL file successfully", async () => { const result = await new Promise((resolve) => { - const proc = spawn("node", [binPath, "check", testSqlPath], { - env: { ...process.env }, - }); + const proc = spawn( + "node", + [binPath, "check", "--disable-db", testSqlPath], + { + env: { ...process.env }, + } + ); let stdout = ""; let stderr = ""; diff --git a/packages/@postgrestools/backend-jsonrpc/tests/workspace.test.mjs b/packages/@postgrestools/backend-jsonrpc/tests/workspace.test.mjs index cf0f13ae6..3c32d574c 100644 --- a/packages/@postgrestools/backend-jsonrpc/tests/workspace.test.mjs +++ b/packages/@postgrestools/backend-jsonrpc/tests/workspace.test.mjs @@ -10,7 +10,7 @@ describe("Workspace API", () => { const command = resolve( fileURLToPath(import.meta.url), "../../../../..", - `target/release/postgrestools${extension}`, + `target/release/postgres-language-server${extension}`, ); const workspace = await createWorkspaceWithBinary(command);