@@ -15784,9 +15784,11 @@ impl<'a> Parser<'a> {
1578415784 loop {
1578515785 let global = self.parse_keyword(Keyword::GLOBAL);
1578615786 let join = if self.parse_keyword(Keyword::CROSS) {
15787+ let directed =
15788+ self.dialect.supports_directed_join() && self.parse_keyword(Keyword::DIRECTED);
1578715789 let join_operator = if self.parse_keyword(Keyword::JOIN) {
1578815790 JoinOperator::CrossJoin(JoinConstraint::None)
15789- } else if self.parse_keyword(Keyword::APPLY) {
15791+ } else if !directed && self.parse_keyword(Keyword::APPLY) {
1579015792 // MSSQL extension, similar to CROSS JOIN LATERAL
1579115793 JoinOperator::CrossApply
1579215794 } else {
@@ -15804,6 +15806,7 @@ impl<'a> Parser<'a> {
1580415806 Join {
1580515807 relation,
1580615808 global,
15809+ directed,
1580715810 join_operator,
1580815811 }
1580915812 } else if self.parse_keyword(Keyword::OUTER) {
@@ -15812,6 +15815,7 @@ impl<'a> Parser<'a> {
1581215815 Join {
1581315816 relation: self.parse_table_factor()?,
1581415817 global,
15818+ directed: false,
1581515819 join_operator: JoinOperator::OuterApply,
1581615820 }
1581715821 } else if self.parse_keyword(Keyword::ASOF) {
@@ -15822,6 +15826,7 @@ impl<'a> Parser<'a> {
1582215826 Join {
1582315827 relation,
1582415828 global,
15829+ directed: false,
1582515830 join_operator: JoinOperator::AsOf {
1582615831 match_condition,
1582715832 constraint: self.parse_join_constraint(false)?,
@@ -15834,6 +15839,7 @@ impl<'a> Parser<'a> {
1583415839 Join {
1583515840 relation: self.parse_table_factor()?,
1583615841 global,
15842+ directed: false,
1583715843 join_operator: JoinOperator::InnerArrayJoin,
1583815844 }
1583915845 } else if self.dialect.supports_array_join_syntax()
@@ -15843,6 +15849,7 @@ impl<'a> Parser<'a> {
1584315849 Join {
1584415850 relation: self.parse_table_factor()?,
1584515851 global,
15852+ directed: false,
1584615853 join_operator: JoinOperator::LeftArrayJoin,
1584715854 }
1584815855 } else if self.dialect.supports_array_join_syntax()
@@ -15852,10 +15859,12 @@ impl<'a> Parser<'a> {
1585215859 Join {
1585315860 relation: self.parse_table_factor()?,
1585415861 global,
15862+ directed: false,
1585515863 join_operator: JoinOperator::ArrayJoin,
1585615864 }
1585715865 } else {
1585815866 let natural = self.parse_keyword(Keyword::NATURAL);
15867+ let mut directed = false;
1585915868 let peek_keyword = if let Token::Word(w) = &self.peek_token_ref().token {
1586015869 w.keyword
1586115870 } else {
@@ -15865,6 +15874,10 @@ impl<'a> Parser<'a> {
1586515874 let join_operator_type = match peek_keyword {
1586615875 Keyword::INNER | Keyword::JOIN => {
1586715876 let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
15877+ if inner {
15878+ directed = self.dialect.supports_directed_join()
15879+ && self.parse_keyword(Keyword::DIRECTED);
15880+ }
1586815881 self.expect_keyword_is(Keyword::JOIN)?;
1586915882 if inner {
1587015883 JoinOperator::Inner
@@ -15879,10 +15892,13 @@ impl<'a> Parser<'a> {
1587915892 Keyword::OUTER,
1588015893 Keyword::SEMI,
1588115894 Keyword::ANTI,
15895+ Keyword::DIRECTED,
1588215896 Keyword::JOIN,
1588315897 ]);
1588415898 match join_type {
1588515899 Some(Keyword::OUTER) => {
15900+ directed = self.dialect.supports_directed_join()
15901+ && self.parse_keyword(Keyword::DIRECTED);
1588615902 self.expect_keyword_is(Keyword::JOIN)?;
1588715903 if is_left {
1588815904 JoinOperator::LeftOuter
@@ -15906,6 +15922,15 @@ impl<'a> Parser<'a> {
1590615922 JoinOperator::RightAnti
1590715923 }
1590815924 }
15925+ Some(Keyword::DIRECTED) if self.dialect.supports_directed_join() => {
15926+ directed = true;
15927+ self.expect_keyword_is(Keyword::JOIN)?;
15928+ if is_left {
15929+ JoinOperator::Left
15930+ } else {
15931+ JoinOperator::Right
15932+ }
15933+ }
1590915934 Some(Keyword::JOIN) => {
1591015935 if is_left {
1591115936 JoinOperator::Left
@@ -15915,7 +15940,7 @@ impl<'a> Parser<'a> {
1591515940 }
1591615941 _ => {
1591715942 return Err(ParserError::ParserError(format!(
15918- "expected OUTER, SEMI, ANTI or JOIN after {kw:?}"
15943+ "expected OUTER, SEMI, ANTI, DIRECTED or JOIN after {kw:?}"
1591915944 )))
1592015945 }
1592115946 }
@@ -15933,6 +15958,8 @@ impl<'a> Parser<'a> {
1593315958 Keyword::FULL => {
1593415959 let _ = self.next_token(); // consume FULL
1593515960 let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
15961+ directed = self.dialect.supports_directed_join()
15962+ && self.parse_keyword(Keyword::DIRECTED);
1593615963 self.expect_keyword_is(Keyword::JOIN)?;
1593715964 JoinOperator::FullOuter
1593815965 }
@@ -15967,6 +15994,7 @@ impl<'a> Parser<'a> {
1596715994 Join {
1596815995 relation,
1596915996 global,
15997+ directed,
1597015998 join_operator: join_operator_type(join_constraint),
1597115999 }
1597216000 };
0 commit comments