mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-03 22:08:16 +00:00
[mssql] Parse CROSS/OUTER APPLY
T-SQL (and Oracle) support non-standard syntax, which is similar in functionality to LATERAL joins in ANSI and PostgreSQL <https://blog.jooq.org/tag/lateral-derived-table/>: it allows to use the columns from the tables defined to the left of `APPLY` in the "derived tables" (subqueries) to the right of `APPLY`. Unlike ANSI LATERAL (but like Postgres' implementation), APPLY is also used with table-valued function calls. Despite them being similar, we represent "APPLY" joins with `JoinOperator`s of its own (`CrossApply` and `OuterApply`). Doing otherwise seemed like it would cause unnecessary confusion, as those interested in dialect-specific parsing would probably not expect APPLY being parsed as LATERAL, and those wanting to forbid non-standard SQL would not be helped by this either. This also renames existing JoinOperator::Cross -> CrossJoin to avoid confusion with CrossApply.
This commit is contained in:
parent
0f6bf15258
commit
4294581ded
5 changed files with 44 additions and 10 deletions
|
@ -52,6 +52,22 @@ fn parse_mssql_delimited_identifiers() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_mssql_apply_join() {
|
||||
let _ = ms_and_generic().verified_only_select(
|
||||
"SELECT * FROM sys.dm_exec_query_stats AS deqs \
|
||||
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle)",
|
||||
);
|
||||
let _ = ms_and_generic().verified_only_select(
|
||||
"SELECT * FROM sys.dm_exec_query_stats AS deqs \
|
||||
OUTER APPLY sys.dm_exec_query_plan(deqs.plan_handle)",
|
||||
);
|
||||
let _ = ms_and_generic().verified_only_select(
|
||||
"SELECT * FROM foo \
|
||||
OUTER APPLY (SELECT foo.x + 1) AS bar",
|
||||
);
|
||||
}
|
||||
|
||||
fn ms() -> TestedDialects {
|
||||
TestedDialects {
|
||||
dialects: vec![Box::new(MsSqlDialect {})],
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue