Skip to content

Commit ad2b0fa

Browse files
committed
[Oracle] Support CONNECT_BY_ROOT
1 parent c86c679 commit ad2b0fa

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

src/dialect/oracle.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ use crate::{
2222
tokenizer::Token,
2323
};
2424

25-
use super::{Dialect, Precedence};
25+
use super::{Dialect, Precedence, keywords::Keyword};
26+
27+
const RESERVED_KEYWORDS_FOR_SELECT_ITEM_OPERATOR: [Keyword; 1] = [Keyword::CONNECT_BY_ROOT];
2628

2729
/// A [`Dialect`] for [Oracle Databases](https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/index.html)
2830
#[derive(Debug)]
@@ -96,6 +98,10 @@ impl Dialect for OracleDialect {
9698
true
9799
}
98100

101+
fn get_reserved_keywords_for_select_item_operator(&self) -> &[Keyword] {
102+
&RESERVED_KEYWORDS_FOR_SELECT_ITEM_OPERATOR
103+
}
104+
99105
fn supports_quote_delimited_string(&self) -> bool {
100106
true
101107
}

tests/sqlparser_oracle.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,3 +388,27 @@ fn test_optimizer_hints() {
388388
VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title)",
389389
);
390390
}
391+
392+
#[test]
393+
fn test_connect_by() {
394+
let oracle_dialect = oracle();
395+
396+
oracle_dialect.verified_only_select(
397+
"SELECT last_name AS \"Employee\", CONNECT_BY_ISCYCLE AS \"Cycle\", \
398+
LEVEL, \
399+
SYS_CONNECT_BY_PATH(last_name, '/') AS \"Path\" \
400+
FROM employees \
401+
WHERE level <= 3 AND department_id = 80 \
402+
START WITH last_name = 'King' \
403+
CONNECT BY NOCYCLE PRIOR employee_id = manager_id AND LEVEL <= 4 \
404+
ORDER BY \"Employee\", \"Cycle\", LEVEL, \"Path\"");
405+
406+
// ~ CONNECT_BY_ROOT
407+
oracle_dialect.verified_only_select(
408+
"SELECT last_name AS \"Employee\", CONNECT_BY_ROOT last_name AS \"Manager\", \
409+
LEVEL - 1 AS \"Pathlen\", SYS_CONNECT_BY_PATH(last_name, '/') AS \"Path\" \
410+
FROM employees \
411+
WHERE LEVEL > 1 AND department_id = 110 \
412+
CONNECT BY PRIOR employee_id = manager_id \
413+
ORDER BY \"Employee\", \"Manager\", \"Pathlen\", \"Path\"");
414+
}

0 commit comments

Comments
 (0)