Skip to content

Commit 449673d

Browse files
authored
Merge pull request #29 from future-architect/flatten-table-func-element-list
Flatten TableFuncElementList (including test improvement)
2 parents eeb064f + 5a97979 commit 449673d

File tree

2 files changed

+89
-19
lines changed

2 files changed

+89
-19
lines changed

crates/postgresql-cst-parser/src/tree_sitter/assert_util.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,26 @@ pub fn assert_no_direct_nested_kind(root: &ResolvedNode, kind: SyntaxKind) {
4545
}
4646
}
4747

48+
/// Asserts that there is at least one directly nested node of the specified `SyntaxKind`.
49+
/// In other words, there must be a node of `kind` that has another `kind` node as its immediate child.
50+
pub fn assert_direct_nested_kind(root: &ResolvedNode, kind: SyntaxKind) {
51+
let has_direct_nesting = root
52+
.descendants()
53+
.filter(|node| node.kind() == kind)
54+
.any(|node| {
55+
if let Some(parent) = node.parent() {
56+
node.kind() == kind && parent.kind() == kind
57+
} else {
58+
false
59+
}
60+
});
61+
62+
assert!(
63+
has_direct_nesting,
64+
"Expected at least one directly nested {kind:?} node, but none was found."
65+
);
66+
}
67+
4868
#[cfg(test)]
4969
mod tests {
5070
use super::*;
@@ -118,4 +138,23 @@ mod tests {
118138

119139
assert_no_direct_nested_kind(&root, SyntaxKind::target_list);
120140
}
141+
142+
#[test]
143+
fn test_direct_nested_kind_passes() {
144+
let input = "select a,b,c;";
145+
let root = cst::parse(input).unwrap();
146+
147+
assert_direct_nested_kind(&root, SyntaxKind::target_list);
148+
}
149+
150+
#[test]
151+
#[should_panic(
152+
expected = "Expected at least one directly nested SelectStmt node, but none was found."
153+
)]
154+
fn test_direct_nested_kind_fails() {
155+
let input = "select a;";
156+
let root = cst::parse(input).unwrap();
157+
158+
assert_direct_nested_kind(&root, SyntaxKind::SelectStmt);
159+
}
121160
}

crates/postgresql-cst-parser/src/tree_sitter/convert.rs

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ fn walk_and_build(
154154
| SyntaxKind::set_target_list
155155
| SyntaxKind::insert_column_list
156156
| SyntaxKind::index_params
157-
| SyntaxKind::values_clause) => {
157+
| SyntaxKind::values_clause
158+
| SyntaxKind::TableFuncElementList) => {
158159
if parent_kind == child_kind {
159160
// [Node: Flatten]
160161
//
@@ -325,7 +326,9 @@ FROM
325326
cst,
326327
syntax_kind::SyntaxKind,
327328
tree_sitter::{
328-
assert_util::{assert_no_direct_nested_kind, assert_node_count},
329+
assert_util::{
330+
assert_direct_nested_kind, assert_no_direct_nested_kind, assert_node_count,
331+
},
329332
convert::get_ts_tree_and_range_map,
330333
},
331334
};
@@ -336,6 +339,7 @@ FROM
336339

337340
let root = cst::parse(input).unwrap();
338341
assert_node_count(&root, SyntaxKind::target_list, 3);
342+
assert_direct_nested_kind(&root, SyntaxKind::target_list);
339343

340344
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
341345
assert_node_count(&new_root, SyntaxKind::target_list, 1);
@@ -346,17 +350,19 @@ FROM
346350
fn no_nested_stmtmulti() {
347351
let input = "select a,b,c;\nselect d,e from t;";
348352
let root = cst::parse(input).unwrap();
349-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
353+
assert_direct_nested_kind(&root, SyntaxKind::stmtmulti);
350354

355+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
351356
assert_no_direct_nested_kind(&new_root, SyntaxKind::stmtmulti);
352357
}
353358

354359
#[test]
355360
fn no_nested_from_list() {
356361
let input = "select * from t1, t2;";
357362
let root = cst::parse(input).unwrap();
358-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
363+
assert_direct_nested_kind(&root, SyntaxKind::from_list);
359364

365+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
360366
assert_no_direct_nested_kind(&new_root, SyntaxKind::from_list);
361367
}
362368

@@ -365,135 +371,160 @@ FROM
365371
let input =
366372
"select t.a, t.b.c, t1.*, a[1], a[4][5], a[2:5], a[3].b, a[3][4].b, a[3:5].b;";
367373
let root = cst::parse(input).unwrap();
368-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
374+
assert_direct_nested_kind(&root, SyntaxKind::indirection);
369375

376+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
370377
assert_no_direct_nested_kind(&new_root, SyntaxKind::indirection);
371378
}
372379

373380
#[test]
374381
fn no_nested_expr_list() {
375382
let input = "select a from t where a in (1,2,3);";
376383
let root = cst::parse(input).unwrap();
377-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
384+
assert_direct_nested_kind(&root, SyntaxKind::expr_list);
378385

386+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
379387
assert_no_direct_nested_kind(&new_root, SyntaxKind::expr_list);
380388
}
381389

382390
#[test]
383391
fn no_nested_func_arg_list() {
384392
let input = "select func(1, 2, func2(3, 4), 5);";
385393
let root = cst::parse(input).unwrap();
386-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
394+
assert_direct_nested_kind(&root, SyntaxKind::func_arg_list);
387395

396+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
388397
assert_no_direct_nested_kind(&new_root, SyntaxKind::func_arg_list);
389398
}
390399

391400
#[test]
392401
fn no_nested_when_clause_list() {
393402
let input = "select case when a then b when c then d when e then f else g end;";
394403
let root = cst::parse(input).unwrap();
395-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
404+
assert_direct_nested_kind(&root, SyntaxKind::when_clause_list);
396405

406+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
397407
assert_no_direct_nested_kind(&new_root, SyntaxKind::when_clause_list);
398408
}
399409

400410
#[test]
401411
fn no_nested_sortby_list() {
402412
let input = "select * from t order by a, b, c;";
403413
let root = cst::parse(input).unwrap();
404-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
414+
assert_direct_nested_kind(&root, SyntaxKind::sortby_list);
405415

416+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
406417
assert_no_direct_nested_kind(&new_root, SyntaxKind::sortby_list);
407418
}
408419

409420
#[test]
410421
fn no_nested_groupby_list() {
411422
let input = "select a, b, c from t group by a, b, c;";
412423
let root = cst::parse(input).unwrap();
413-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
424+
assert_direct_nested_kind(&root, SyntaxKind::group_by_list);
414425

426+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
415427
assert_no_direct_nested_kind(&new_root, SyntaxKind::group_by_list);
416428
}
417429

418430
#[test]
419431
fn no_nested_for_locking_items() {
420432
let input = "select * from t1, t2 for update of t1 for update of t2;";
421433
let root = cst::parse(input).unwrap();
422-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
434+
assert_direct_nested_kind(&root, SyntaxKind::for_locking_items);
423435

436+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
424437
assert_no_direct_nested_kind(&new_root, SyntaxKind::for_locking_items);
425438
}
426439

427440
#[test]
428441
fn no_nested_qualified_name_list() {
429442
let input = "select a from t for update of t.a, t.b;";
430443
let root = cst::parse(input).unwrap();
431-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
444+
assert_direct_nested_kind(&root, SyntaxKind::qualified_name_list);
432445

446+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
433447
assert_no_direct_nested_kind(&new_root, SyntaxKind::qualified_name_list);
434448
}
435449

436450
#[test]
437451
fn no_nested_cte_list() {
438452
let input = "with a as (select 1), b as (select 2) select * from a, b;";
439453
let root = cst::parse(input).unwrap();
440-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
454+
assert_direct_nested_kind(&root, SyntaxKind::cte_list);
441455

456+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
442457
assert_no_direct_nested_kind(&new_root, SyntaxKind::cte_list);
443458
}
444459

445460
#[test]
446461
fn no_nested_name_list() {
447462
let input = "with t (a, b) as (select 1) select * from t;";
448463
let root = cst::parse(input).unwrap();
449-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
464+
assert_direct_nested_kind(&root, SyntaxKind::name_list);
450465

466+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
451467
assert_no_direct_nested_kind(&new_root, SyntaxKind::name_list);
452468
}
453469

454470
#[test]
455471
fn no_nested_set_clause_list() {
456472
let input = "update t set a = 1, b = 2, c = 3;";
457473
let root = cst::parse(input).unwrap();
458-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
474+
assert_direct_nested_kind(&root, SyntaxKind::set_clause_list);
459475

476+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
460477
assert_no_direct_nested_kind(&new_root, SyntaxKind::set_clause_list);
461478
}
462479

463480
#[test]
464481
fn no_nested_set_target_list() {
465482
let input = "update t set (a, b, c) = (1, 2, 3) where id = 1;";
466483
let root = cst::parse(input).unwrap();
467-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
484+
assert_direct_nested_kind(&root, SyntaxKind::set_target_list);
468485

486+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
469487
assert_no_direct_nested_kind(&new_root, SyntaxKind::set_target_list);
470488
}
471489

472490
#[test]
473491
fn no_nested_insert_column_list() {
474492
let input = "insert into t (a, b, c) values (1, 2, 3);";
475493
let root = cst::parse(input).unwrap();
476-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
494+
assert_direct_nested_kind(&root, SyntaxKind::insert_column_list);
477495

496+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
478497
assert_no_direct_nested_kind(&new_root, SyntaxKind::insert_column_list);
479498
}
480499

481500
#[test]
482501
fn no_nested_index_params() {
483502
let input = "insert into t (a, b, c) values (1, 2, 3) on conflict (a, b) do nothing;";
484503
let root = cst::parse(input).unwrap();
485-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
504+
assert_direct_nested_kind(&root, SyntaxKind::index_params);
486505

506+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
487507
assert_no_direct_nested_kind(&new_root, SyntaxKind::index_params);
488508
}
489509

490510
#[test]
491511
fn no_nested_values_clause() {
492512
let input = "values (1,2,3), (4,5,6), (7,8,9);";
493513
let root = cst::parse(input).unwrap();
494-
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
514+
assert_direct_nested_kind(&root, SyntaxKind::values_clause);
495515

516+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
496517
assert_no_direct_nested_kind(&new_root, SyntaxKind::values_clause);
497518
}
519+
520+
#[test]
521+
fn no_nested_table_func_element_list() {
522+
let input = "select * from unnest(a) as (x int, y text);";
523+
let root = cst::parse(input).unwrap();
524+
assert_direct_nested_kind(&root, SyntaxKind::TableFuncElementList);
525+
526+
let (new_root, _) = get_ts_tree_and_range_map(input, &root);
527+
assert_no_direct_nested_kind(&new_root, SyntaxKind::TableFuncElementList);
528+
}
498529
}
499530
}

0 commit comments

Comments
 (0)