Skip to content

Commit 1c25ec4

Browse files
committed
more changes after rebase
1 parent b35cd68 commit 1c25ec4

8 files changed

+79
-57
lines changed

src/ast/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,14 @@ pub enum ObjectNamePart {
289289
Identifier(Ident),
290290
}
291291

292+
impl ObjectNamePart {
293+
pub fn as_ident(&self) -> Option<&Ident> {
294+
match self {
295+
ObjectNamePart::Identifier(ident) => Some(ident),
296+
}
297+
}
298+
}
299+
292300
impl fmt::Display for ObjectNamePart {
293301
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
294302
match self {

src/ast/spans.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ use super::{
2828
FunctionArg, FunctionArgExpr, FunctionArgumentClause, FunctionArgumentList, FunctionArguments,
2929
GroupByExpr, HavingBound, IlikeSelectItem, Insert, Interpolate, InterpolateExpr, Join,
3030
JoinConstraint, JoinOperator, JsonPath, JsonPathElem, LateralView, MatchRecognizePattern,
31-
Measure, NamedWindowDefinition, ObjectName, ObjectNamePart, Offset, OnConflict, OnConflictAction, OnInsert, OrderBy,
32-
OrderByExpr, Partition, PivotValueSource, ProjectionSelect, Query, ReferentialAction,
33-
RenameSelectItem, ReplaceSelectElement, ReplaceSelectItem, Select, SelectInto, SelectItem,
34-
SetExpr, SqlOption, Statement, Subscript, SymbolDefinition, TableAlias, TableAliasColumnDef,
35-
TableConstraint, TableFactor, TableObject, TableOptionsClustered, TableWithJoins,
36-
UpdateTableFromKind, Use, Value, Values,
37-
ViewColumnDef, WildcardAdditionalOptions, With, WithFill,
31+
Measure, NamedWindowDefinition, ObjectName, ObjectNamePart, Offset, OnConflict,
32+
OnConflictAction, OnInsert, OrderBy, OrderByExpr, Partition, PivotValueSource,
33+
ProjectionSelect, Query, ReferentialAction, RenameSelectItem, ReplaceSelectElement,
34+
ReplaceSelectItem, Select, SelectInto, SelectItem, SetExpr, SqlOption, Statement, Subscript,
35+
SymbolDefinition, TableAlias, TableAliasColumnDef, TableConstraint, TableFactor, TableObject,
36+
TableOptionsClustered, TableWithJoins, UpdateTableFromKind, Use, Value, Values, ViewColumnDef,
37+
WildcardAdditionalOptions, With, WithFill,
3838
};
3939

4040
/// Given an iterator of spans, return the [Span::union] of all spans.
@@ -2149,7 +2149,7 @@ impl Spanned for TableObject {
21492149
fn span(&self) -> Span {
21502150
match self {
21512151
TableObject::TableName(ObjectName(segments)) => {
2152-
union_spans(segments.iter().map(|i| i.span))
2152+
union_spans(segments.iter().map(|i| i.span()))
21532153
}
21542154
TableObject::TableFunction(func) => func.span(),
21552155
}

src/parser/mod.rs

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,7 +1553,7 @@ impl<'a> Parser<'a> {
15531553
return self.expected("an identifier or a '*' after '.'", self.peek_token());
15541554
};
15551555
Ok(Expr::QualifiedWildcard(
1556-
ObjectName(Self::exprs_to_idents(root, chain)?),
1556+
ObjectName::from(Self::exprs_to_idents(root, chain)?),
15571557
AttachedToken(wildcard_token),
15581558
))
15591559
} else if self.peek_token().token == Token::LParen {
@@ -1566,7 +1566,7 @@ impl<'a> Parser<'a> {
15661566
if let Some(expr) = self.parse_outer_join_expr(&id_parts) {
15671567
Ok(expr)
15681568
} else {
1569-
self.parse_function(ObjectName(id_parts))
1569+
self.parse_function(ObjectName::from(id_parts))
15701570
}
15711571
} else {
15721572
if Self::is_all_ident(&root, &chain) {
@@ -9076,7 +9076,7 @@ impl<'a> Parser<'a> {
90769076
}
90779077
}
90789078
}
9079-
Ok(ObjectName(idents))
9079+
Ok(ObjectName::from(idents))
90809080
}
90819081

90829082
/// Parse a possibly qualified, possibly quoted identifier, e.g.
@@ -9092,25 +9092,33 @@ impl<'a> Parser<'a> {
90929092
// BigQuery accepts any number of quoted identifiers of a table name.
90939093
// https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
90949094
if dialect_of!(self is BigQueryDialect)
9095-
&& idents.iter().any(|ident| ident.value.contains('.'))
9095+
&& idents.iter().any(|part| {
9096+
part.as_ident()
9097+
.is_some_and(|ident| ident.value.contains('.'))
9098+
})
90969099
{
90979100
idents = idents
90989101
.into_iter()
9099-
.flat_map(|ident| {
9100-
ident
9101-
.value
9102-
.split('.')
9103-
.map(|value| Ident {
9104-
value: value.into(),
9105-
quote_style: ident.quote_style,
9106-
span: ident.span,
9107-
})
9108-
.collect::<Vec<_>>()
9102+
.flat_map(|part| {
9103+
match part.as_ident() {
9104+
Some(ident) => ident
9105+
.value
9106+
.split('.')
9107+
.map(|value| {
9108+
ObjectNamePart::Identifier(Ident {
9109+
value: value.into(),
9110+
quote_style: ident.quote_style,
9111+
span: ident.span,
9112+
})
9113+
})
9114+
.collect::<Vec<_>>(),
9115+
None => vec![part],
9116+
}
91099117
})
91109118
.collect()
91119119
}
91129120

9113-
Ok(ObjectName::from(idents))
9121+
Ok(ObjectName(idents))
91149122
}
91159123

91169124
/// Parse identifiers
@@ -11828,7 +11836,7 @@ impl<'a> Parser<'a> {
1182811836
self.expect_token(&Token::LParen)?;
1182911837
let aggregate_functions = self.parse_comma_separated(Self::parse_aliased_function_call)?;
1183011838
self.expect_keyword_is(Keyword::FOR)?;
11831-
let value_column = self.parse_period_separated(|p| p.parse_identifier(false))?;
11839+
let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
1183211840
self.expect_keyword_is(Keyword::IN)?;
1183311841

1183411842
self.expect_token(&Token::LParen)?;
@@ -11964,10 +11972,9 @@ impl<'a> Parser<'a> {
1196411972
// https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
1196511973
let ident = self.parse_identifier()?;
1196611974
if let GranteeName::ObjectName(namespace) = name {
11967-
name = GranteeName::ObjectName(ObjectName(vec![Ident::new(format!(
11968-
"{}:{}",
11969-
namespace, ident
11970-
))]));
11975+
name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
11976+
format!("{}:{}", namespace, ident),
11977+
)]));
1197111978
};
1197211979
}
1197311980
Grantee {
@@ -12276,9 +12283,10 @@ impl<'a> Parser<'a> {
1227612283
let mut name = self.parse_object_name(false)?;
1227712284
if self.dialect.supports_user_host_grantee()
1227812285
&& name.0.len() == 1
12286+
&& name.0[0].as_ident().is_some()
1227912287
&& self.consume_token(&Token::AtSign)
1228012288
{
12281-
let user = name.0.pop().unwrap();
12289+
let user = name.0.pop().unwrap().as_ident().unwrap().clone();
1228212290
let host = self.parse_identifier()?;
1228312291
Ok(GranteeName::UserHost { user, host })
1228412292
} else {

tests/sqlparser_bigquery.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,7 +1518,10 @@ fn parse_hyphenated_table_identifiers() {
15181518
)
15191519
.from[0]
15201520
.relation,
1521-
table_from_name(ObjectName(vec![Ident::new("foo-123"), Ident::new("bar")])),
1521+
table_from_name(ObjectName::from(vec![
1522+
Ident::new("foo-123"),
1523+
Ident::new("bar")
1524+
])),
15221525
);
15231526

15241527
assert_eq!(
@@ -1985,7 +1988,7 @@ fn parse_map_access_expr() {
19851988
}),
19861989
AccessExpr::Subscript(Subscript::Index {
19871990
index: Expr::Function(Function {
1988-
name: ObjectName(vec![Ident::with_span(
1991+
name: ObjectName::from(vec![Ident::with_span(
19891992
Span::new(Location::of(1, 11), Location::of(1, 22)),
19901993
"safe_offset",
19911994
)]),

tests/sqlparser_common.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4179,11 +4179,11 @@ fn parse_rename_table() {
41794179
Statement::RenameTable(rename_tables) => {
41804180
assert_eq!(
41814181
vec![RenameTable {
4182-
old_name: ObjectName(vec![
4182+
old_name: ObjectName::from(vec![
41834183
Ident::new("test".to_string()),
41844184
Ident::new("test1".to_string()),
41854185
]),
4186-
new_name: ObjectName(vec![
4186+
new_name: ObjectName::from(vec![
41874187
Ident::new("test_db".to_string()),
41884188
Ident::new("test2".to_string()),
41894189
]),
@@ -4201,16 +4201,16 @@ fn parse_rename_table() {
42014201
assert_eq!(
42024202
vec![
42034203
RenameTable {
4204-
old_name: ObjectName(vec![Ident::new("old_table1".to_string())]),
4205-
new_name: ObjectName(vec![Ident::new("new_table1".to_string())]),
4204+
old_name: ObjectName::from(vec![Ident::new("old_table1".to_string())]),
4205+
new_name: ObjectName::from(vec![Ident::new("new_table1".to_string())]),
42064206
},
42074207
RenameTable {
4208-
old_name: ObjectName(vec![Ident::new("old_table2".to_string())]),
4209-
new_name: ObjectName(vec![Ident::new("new_table2".to_string())]),
4208+
old_name: ObjectName::from(vec![Ident::new("old_table2".to_string())]),
4209+
new_name: ObjectName::from(vec![Ident::new("new_table2".to_string())]),
42104210
},
42114211
RenameTable {
4212-
old_name: ObjectName(vec![Ident::new("old_table3".to_string())]),
4213-
new_name: ObjectName(vec![Ident::new("new_table3".to_string())]),
4212+
old_name: ObjectName::from(vec![Ident::new("old_table3".to_string())]),
4213+
new_name: ObjectName::from(vec![Ident::new("new_table3".to_string())]),
42144214
}
42154215
],
42164216
rename_tables
@@ -6544,7 +6544,9 @@ fn parse_joins_using() {
65446544
sample: None,
65456545
},
65466546
global: false,
6547-
join_operator: f(JoinConstraint::Using(vec![ObjectName(vec!["c1".into()])])),
6547+
join_operator: f(JoinConstraint::Using(vec![ObjectName::from(vec![
6548+
"c1".into()
6549+
])])),
65486550
}
65496551
}
65506552
// Test parsing of aliases
@@ -8733,10 +8735,9 @@ fn parse_merge() {
87338735
)],
87348736
into: None,
87358737
from: vec![TableWithJoins {
8736-
relation: table_from_name( ObjectName::from(vec![
8737-
Ident::new("s"),
8738-
Ident::new("foo")
8739-
8738+
relation: table_from_name(ObjectName::from(vec![
8739+
Ident::new("s"),
8740+
Ident::new("foo")
87408741
])),
87418742
joins: vec![],
87428743
}],
@@ -10606,7 +10607,7 @@ fn parse_map_access_expr() {
1060610607
}),
1060710608
AccessExpr::Subscript(Subscript::Index {
1060810609
index: Expr::Function(Function {
10609-
name: ObjectName(vec![Ident::with_span(
10610+
name: ObjectName::from(vec![Ident::with_span(
1061010611
Span::new(Location::of(1, 11), Location::of(1, 22)),
1061110612
"safe_offset",
1061210613
)]),
@@ -11266,7 +11267,7 @@ fn parse_odbc_scalar_function() {
1126611267
else {
1126711268
unreachable!("expected function")
1126811269
};
11269-
assert_eq!(name, &ObjectName(vec![Ident::new("my_func")]));
11270+
assert_eq!(name, &ObjectName::from(vec![Ident::new("my_func")]));
1127011271
assert!(uses_odbc_syntax);
1127111272
matches!(args, FunctionArguments::List(l) if l.args.len() == 2);
1127211273

@@ -12821,7 +12822,7 @@ fn parse_composite_access_expr() {
1282112822
verified_expr("f(a).b"),
1282212823
Expr::CompoundFieldAccess {
1282312824
root: Box::new(Expr::Function(Function {
12824-
name: ObjectName(vec![Ident::new("f")]),
12825+
name: ObjectName::from(vec![Ident::new("f")]),
1282512826
uses_odbc_syntax: false,
1282612827
parameters: FunctionArguments::None,
1282712828
args: FunctionArguments::List(FunctionArgumentList {
@@ -12845,7 +12846,7 @@ fn parse_composite_access_expr() {
1284512846
verified_expr("f(a).b.c"),
1284612847
Expr::CompoundFieldAccess {
1284712848
root: Box::new(Expr::Function(Function {
12848-
name: ObjectName(vec![Ident::new("f")]),
12849+
name: ObjectName::from(vec![Ident::new("f")]),
1284912850
uses_odbc_syntax: false,
1285012851
parameters: FunctionArguments::None,
1285112852
args: FunctionArguments::List(FunctionArgumentList {
@@ -12871,7 +12872,7 @@ fn parse_composite_access_expr() {
1287112872
let stmt = verified_only_select("SELECT f(a).b FROM t WHERE f(a).b IS NOT NULL");
1287212873
let expr = Expr::CompoundFieldAccess {
1287312874
root: Box::new(Expr::Function(Function {
12874-
name: ObjectName(vec![Ident::new("f")]),
12875+
name: ObjectName::from(vec![Ident::new("f")]),
1287512876
uses_odbc_syntax: false,
1287612877
parameters: FunctionArguments::None,
1287712878
args: FunctionArguments::List(FunctionArgumentList {

tests/sqlparser_databricks.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@ fn test_values_clause() {
185185
"SELECT * FROM values",
186186
));
187187
assert_eq!(
188-
Some(&table_from_name(ObjectName::from(vec![Ident::new("values")]))),
188+
Some(&table_from_name(ObjectName::from(vec![Ident::new(
189+
"values"
190+
)]))),
189191
query
190192
.body
191193
.as_select()

tests/sqlparser_mysql.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3044,7 +3044,7 @@ fn parse_grant() {
30443044
);
30453045
assert_eq!(
30463046
objects,
3047-
GrantObjects::Tables(vec![ObjectName(vec!["*".into(), "*".into()])])
3047+
GrantObjects::Tables(vec![ObjectName::from(vec!["*".into(), "*".into()])])
30483048
);
30493049
assert!(!with_grant_option);
30503050
assert!(granted_by.is_none());
@@ -3085,7 +3085,7 @@ fn parse_revoke() {
30853085
);
30863086
assert_eq!(
30873087
objects,
3088-
GrantObjects::Tables(vec![ObjectName(vec!["db1".into(), "*".into()])])
3088+
GrantObjects::Tables(vec![ObjectName::from(vec!["db1".into(), "*".into()])])
30893089
);
30903090
if let [Grantee {
30913091
grantee_type: GranteesType::None,

tests/sqlparser_snowflake.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,7 +1508,7 @@ fn test_alter_table_clustering() {
15081508
Expr::Identifier(Ident::new("c1")),
15091509
Expr::Identifier(Ident::with_quote('"', "c2")),
15101510
Expr::Function(Function {
1511-
name: ObjectName(vec![Ident::new("TO_DATE")]),
1511+
name: ObjectName::from(vec![Ident::new("TO_DATE")]),
15121512
uses_odbc_syntax: false,
15131513
parameters: FunctionArguments::None,
15141514
args: FunctionArguments::List(FunctionArgumentList {
@@ -2837,14 +2837,14 @@ fn parse_use() {
28372837
);
28382838
assert_eq!(
28392839
snowflake().verified_stmt(&format!("USE ROLE {0}my_role{0}", quote)),
2840-
Statement::Use(Use::Role(ObjectName(vec![Ident::with_quote(
2840+
Statement::Use(Use::Role(ObjectName::from(vec![Ident::with_quote(
28412841
quote,
28422842
"my_role".to_string(),
28432843
)])))
28442844
);
28452845
assert_eq!(
28462846
snowflake().verified_stmt(&format!("USE WAREHOUSE {0}my_wh{0}", quote)),
2847-
Statement::Use(Use::Warehouse(ObjectName(vec![Ident::with_quote(
2847+
Statement::Use(Use::Warehouse(ObjectName::from(vec![Ident::with_quote(
28482848
quote,
28492849
"my_wh".to_string(),
28502850
)])))
@@ -3082,7 +3082,7 @@ fn parse_ls_and_rm() {
30823082
.verified_stmt("LIST @SNOWFLAKE_KAFKA_CONNECTOR_externalDataLakeSnowflakeConnector_STAGE_call_tracker_stream/");
30833083
match statement {
30843084
Statement::List(command) => {
3085-
assert_eq!(command.stage, ObjectName(vec!["@SNOWFLAKE_KAFKA_CONNECTOR_externalDataLakeSnowflakeConnector_STAGE_call_tracker_stream/".into()]));
3085+
assert_eq!(command.stage, ObjectName::from(vec!["@SNOWFLAKE_KAFKA_CONNECTOR_externalDataLakeSnowflakeConnector_STAGE_call_tracker_stream/".into()]));
30863086
assert!(command.pattern.is_none());
30873087
}
30883088
_ => unreachable!(),
@@ -3094,7 +3094,7 @@ fn parse_ls_and_rm() {
30943094
Statement::Remove(command) => {
30953095
assert_eq!(
30963096
command.stage,
3097-
ObjectName(vec!["@my_csv_stage/analysis/".into()])
3097+
ObjectName::from(vec!["@my_csv_stage/analysis/".into()])
30983098
);
30993099
assert_eq!(command.pattern, Some(".*data_0.*".to_string()));
31003100
}

0 commit comments

Comments
 (0)