Skip to content

Commit be10534

Browse files
fix bug
1 parent ecd0034 commit be10534

File tree

3 files changed

+96
-3
lines changed

3 files changed

+96
-3
lines changed

crates/pgt_completions/src/providers/columns.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,4 +260,69 @@ mod tests {
260260
.any(|item| item.kind == CompletionItemKind::Column)
261261
);
262262
}
263+
264+
#[tokio::test]
265+
async fn prefers_columns_of_mentioned_tables() {
266+
let setup = r#"
267+
create schema private;
268+
269+
create table private.users (
270+
id1 serial primary key,
271+
name1 text,
272+
address1 text,
273+
email1 text
274+
);
275+
276+
create table public.users (
277+
id2 serial primary key,
278+
name2 text,
279+
address2 text,
280+
email2 text
281+
);
282+
"#;
283+
284+
{
285+
let test_case = TestCase {
286+
message: "",
287+
query: format!(r#"select {} from users"#, CURSOR_POS),
288+
label: "suggests from table",
289+
description: "",
290+
};
291+
292+
let (tree, cache) = get_test_deps(setup, test_case.get_input_query()).await;
293+
let params = get_test_params(&tree, &cache, test_case.get_input_query());
294+
let results = complete(params);
295+
296+
assert_eq!(
297+
results
298+
.into_iter()
299+
.take(4)
300+
.map(|item| item.label)
301+
.collect::<Vec<String>>(),
302+
vec!["address2", "email2", "id2", "name2"]
303+
);
304+
}
305+
306+
{
307+
let test_case = TestCase {
308+
message: "",
309+
query: format!(r#"select {} from private.users"#, CURSOR_POS),
310+
label: "suggests from table",
311+
description: "",
312+
};
313+
314+
let (tree, cache) = get_test_deps(setup, test_case.get_input_query()).await;
315+
let params = get_test_params(&tree, &cache, test_case.get_input_query());
316+
let results = complete(params);
317+
318+
assert_eq!(
319+
results
320+
.into_iter()
321+
.take(4)
322+
.map(|item| item.label)
323+
.collect::<Vec<String>>(),
324+
vec!["address1", "email1", "id1", "name1"]
325+
);
326+
}
327+
}
263328
}

crates/pgt_completions/src/sanitization.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::borrow::Cow;
1+
use std::{borrow::Cow, cmp::max};
22

33
use pgt_text_size::TextSize;
44

@@ -45,12 +45,13 @@ where
4545

4646
let mut sql_iter = params.text.chars();
4747

48-
for idx in 0..cursor_pos + 1 {
48+
let max = max(cursor_pos + 1, params.text.len());
49+
50+
for idx in 0..max {
4951
match sql_iter.next() {
5052
Some(c) => {
5153
if idx == cursor_pos {
5254
sql.push_str(SANITIZED_TOKEN);
53-
sql.push(' ');
5455
}
5556
sql.push(c);
5657
}

crates/pgt_treesitter_queries/src/lib.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,31 @@ on sq1.id = pt.id;
185185
assert_eq!(results[0].get_schema(sql), Some("private".into()));
186186
assert_eq!(results[0].get_table(sql), "something");
187187
}
188+
189+
#[test]
190+
fn picks_it_up_without_schemas() {
191+
let sql = r#"select * from users"#;
192+
193+
let mut parser = tree_sitter::Parser::new();
194+
parser.set_language(tree_sitter_sql::language()).unwrap();
195+
196+
let tree = parser.parse(sql, None).unwrap();
197+
198+
// trust me bro
199+
200+
let mut executor = TreeSitterQueriesExecutor::new(tree.root_node(), sql);
201+
202+
executor.add_query_results::<RelationMatch>();
203+
204+
let results: Vec<&RelationMatch> = executor
205+
.get_iter(None)
206+
.filter_map(|q| q.try_into().ok())
207+
.collect();
208+
209+
println!("{:?}", results);
210+
211+
assert_eq!(results.len(), 1);
212+
assert_eq!(results[0].get_schema(sql), None);
213+
assert_eq!(results[0].get_table(sql), "users");
214+
}
188215
}

0 commit comments

Comments
 (0)