Implement FROM-first selects (#1713)

This commit is contained in:
Armin Ronacher 2025-02-09 06:10:58 +01:00 committed by GitHub
parent cad49232c1
commit 46cfcfe8f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 184 additions and 9 deletions

View file

@ -101,6 +101,7 @@ fn parse_map_access_expr() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
},
select
);

View file

@ -461,6 +461,7 @@ fn parse_update_set_from() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -5289,6 +5290,7 @@ fn test_parse_named_window() {
window_before_qualify: true,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
};
assert_eq!(actual_select_only, expected);
}
@ -5915,6 +5917,7 @@ fn parse_interval_and_or_xor() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -8022,6 +8025,7 @@ fn lateral_function() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
};
assert_eq!(actual_select_only, expected);
}
@ -8919,6 +8923,7 @@ fn parse_merge() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -10703,6 +10708,7 @@ fn parse_unload() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
with: None,
limit: None,
@ -10913,6 +10919,7 @@ fn parse_connect_by() {
))))),
}],
}),
flavor: SelectFlavor::Standard,
};
let connect_by_1 = concat!(
@ -10997,6 +11004,7 @@ fn parse_connect_by() {
))))),
}],
}),
flavor: SelectFlavor::Standard,
}
);
@ -11860,6 +11868,7 @@ fn test_extract_seconds_ok() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -13592,3 +13601,65 @@ fn test_lambdas() {
);
dialects.verified_expr("transform(array(1, 2, 3), x -> x + 1)");
}
#[test]
fn test_select_from_first() {
let dialects = all_dialects_where(|d| d.supports_from_first_select());
let q1 = "FROM capitals";
let q2 = "FROM capitals SELECT *";
for (q, flavor, projection) in [
(q1, SelectFlavor::FromFirstNoSelect, vec![]),
(
q2,
SelectFlavor::FromFirst,
vec![SelectItem::Wildcard(WildcardAdditionalOptions::default())],
),
] {
let ast = dialects.verified_query(q);
let expected = Query {
with: None,
body: Box::new(SetExpr::Select(Box::new(Select {
select_token: AttachedToken::empty(),
distinct: None,
top: None,
projection,
top_before_distinct: false,
into: None,
from: vec![TableWithJoins {
relation: table_from_name(ObjectName::from(vec![Ident {
value: "capitals".to_string(),
quote_style: None,
span: Span::empty(),
}])),
joins: vec![],
}],
lateral_views: vec![],
prewhere: None,
selection: None,
group_by: GroupByExpr::Expressions(vec![], vec![]),
cluster_by: vec![],
distribute_by: vec![],
sort_by: vec![],
having: None,
named_window: vec![],
window_before_qualify: false,
qualify: None,
value_table_mode: None,
connect_by: None,
flavor,
}))),
order_by: None,
limit: None,
offset: None,
fetch: None,
locks: vec![],
limit_by: vec![],
for_clause: None,
settings: None,
format_clause: None,
};
assert_eq!(expected, ast);
assert_eq!(ast.to_string(), q);
}
}

View file

@ -288,6 +288,7 @@ fn test_select_union_by_name() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
right: Box::<SetExpr>::new(SetExpr::Select(Box::new(Select {
select_token: AttachedToken::empty(),
@ -317,6 +318,7 @@ fn test_select_union_by_name() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
});
assert_eq!(ast.body, expected);

View file

@ -137,6 +137,7 @@ fn parse_create_procedure() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
})))
}))],
params: Some(vec![
@ -1114,6 +1115,7 @@ fn parse_substring_in_select() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -1251,6 +1253,7 @@ fn parse_mssql_declare() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
})))
}))
],

View file

@ -1111,6 +1111,7 @@ fn parse_escaped_quote_identifiers_with_escape() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -1164,6 +1165,7 @@ fn parse_escaped_quote_identifiers_with_no_escape() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -1211,6 +1213,7 @@ fn parse_escaped_backticks_with_escape() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -1262,6 +1265,7 @@ fn parse_escaped_backticks_with_no_escape() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -1931,6 +1935,7 @@ fn parse_select_with_numeric_prefix_column_name() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
})))
);
}
@ -1983,6 +1988,7 @@ fn parse_select_with_concatenation_of_exp_number_and_numeric_prefix_column() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
})))
);
}
@ -2503,6 +2509,7 @@ fn parse_substring_in_select() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -2799,6 +2806,7 @@ fn parse_hex_string_introducer() {
value_table_mode: None,
into: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,

View file

@ -1315,6 +1315,7 @@ fn parse_copy_to() {
qualify: None,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
order_by: None,
limit: None,
@ -2666,6 +2667,7 @@ fn parse_array_subquery_expr() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
right: Box::new(SetExpr::Select(Box::new(Select {
select_token: AttachedToken::empty(),
@ -2688,6 +2690,7 @@ fn parse_array_subquery_expr() {
window_before_qualify: false,
value_table_mode: None,
connect_by: None,
flavor: SelectFlavor::Standard,
}))),
}),
order_by: None,