Skip to content

Commit 901f5b9

Browse files
author
Riccardo Azzolini
authored
Distinguish between tables and nullary functions in FROM (#506)
1 parent cd66034 commit 901f5b9

9 files changed

+39
-29
lines changed

src/ast/query.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,11 @@ pub enum TableFactor {
337337
/// Arguments of a table-valued function, as supported by Postgres
338338
/// and MSSQL. Note that deprecated MSSQL `FROM foo (NOLOCK)` syntax
339339
/// will also be parsed as `args`.
340-
args: Vec<FunctionArg>,
340+
///
341+
/// This field's value is `Some(v)`, where `v` is a (possibly empty)
342+
/// vector of arguments, in the case of a table-valued function call,
343+
/// whereas it's `None` in the case of a regular table name.
344+
args: Option<Vec<FunctionArg>>,
341345
/// MSSQL-specific `WITH (...)` hints such as NOLOCK.
342346
with_hints: Vec<Expr>,
343347
},
@@ -370,7 +374,7 @@ impl fmt::Display for TableFactor {
370374
with_hints,
371375
} => {
372376
write!(f, "{}", name)?;
373-
if !args.is_empty() {
377+
if let Some(args) = args {
374378
write!(f, "({})", display_comma_separated(args))?;
375379
}
376380
if let Some(alias) = alias {

src/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3623,9 +3623,9 @@ impl<'a> Parser<'a> {
36233623
let name = self.parse_object_name()?;
36243624
// Postgres, MSSQL: table-valued functions:
36253625
let args = if self.consume_token(&Token::LParen) {
3626-
self.parse_optional_args()?
3626+
Some(self.parse_optional_args()?)
36273627
} else {
3628-
vec![]
3628+
None
36293629
};
36303630
let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
36313631
// MSSQL-specific table hints:

src/test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ pub fn table(name: impl Into<String>) -> TableFactor {
177177
TableFactor::Table {
178178
name: ObjectName(vec![Ident::new(name.into())]),
179179
alias: None,
180-
args: vec![],
180+
args: None,
181181
with_hints: vec![],
182182
}
183183
}

tests/sqlparser_bigquery.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn parse_table_identifiers() {
2929
relation: TableFactor::Table {
3030
name: ObjectName(expected),
3131
alias: None,
32-
args: vec![],
32+
args: None,
3333
with_hints: vec![],
3434
},
3535
joins: vec![]

tests/sqlparser_common.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ fn parse_update_with_table_alias() {
200200
name: Ident::new("u"),
201201
columns: vec![]
202202
}),
203-
args: vec![],
203+
args: None,
204204
with_hints: vec![],
205205
},
206206
joins: vec![]
@@ -2793,7 +2793,7 @@ fn parse_delimited_identifiers() {
27932793
} => {
27942794
assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
27952795
assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
2796-
assert!(args.is_empty());
2796+
assert!(args.is_none());
27972797
assert!(with_hints.is_empty());
27982798
}
27992799
_ => panic!("Expecting TableFactor::Table"),
@@ -2912,6 +2912,12 @@ fn parse_from_advanced() {
29122912
let _select = verified_only_select(sql);
29132913
}
29142914

2915+
#[test]
2916+
fn parse_nullary_table_valued_function() {
2917+
let sql = "SELECT * FROM fn()";
2918+
let _select = verified_only_select(sql);
2919+
}
2920+
29152921
#[test]
29162922
fn parse_implicit_join() {
29172923
let sql = "SELECT * FROM t1, t2";
@@ -2922,7 +2928,7 @@ fn parse_implicit_join() {
29222928
relation: TableFactor::Table {
29232929
name: ObjectName(vec!["t1".into()]),
29242930
alias: None,
2925-
args: vec![],
2931+
args: None,
29262932
with_hints: vec![],
29272933
},
29282934
joins: vec![],
@@ -2931,7 +2937,7 @@ fn parse_implicit_join() {
29312937
relation: TableFactor::Table {
29322938
name: ObjectName(vec!["t2".into()]),
29332939
alias: None,
2934-
args: vec![],
2940+
args: None,
29352941
with_hints: vec![],
29362942
},
29372943
joins: vec![],
@@ -2948,14 +2954,14 @@ fn parse_implicit_join() {
29482954
relation: TableFactor::Table {
29492955
name: ObjectName(vec!["t1a".into()]),
29502956
alias: None,
2951-
args: vec![],
2957+
args: None,
29522958
with_hints: vec![],
29532959
},
29542960
joins: vec![Join {
29552961
relation: TableFactor::Table {
29562962
name: ObjectName(vec!["t1b".into()]),
29572963
alias: None,
2958-
args: vec![],
2964+
args: None,
29592965
with_hints: vec![],
29602966
},
29612967
join_operator: JoinOperator::Inner(JoinConstraint::Natural),
@@ -2965,14 +2971,14 @@ fn parse_implicit_join() {
29652971
relation: TableFactor::Table {
29662972
name: ObjectName(vec!["t2a".into()]),
29672973
alias: None,
2968-
args: vec![],
2974+
args: None,
29692975
with_hints: vec![],
29702976
},
29712977
joins: vec![Join {
29722978
relation: TableFactor::Table {
29732979
name: ObjectName(vec!["t2b".into()]),
29742980
alias: None,
2975-
args: vec![],
2981+
args: None,
29762982
with_hints: vec![],
29772983
},
29782984
join_operator: JoinOperator::Inner(JoinConstraint::Natural),
@@ -2992,7 +2998,7 @@ fn parse_cross_join() {
29922998
relation: TableFactor::Table {
29932999
name: ObjectName(vec![Ident::new("t2")]),
29943000
alias: None,
2995-
args: vec![],
3001+
args: None,
29963002
with_hints: vec![],
29973003
},
29983004
join_operator: JoinOperator::CrossJoin
@@ -3012,7 +3018,7 @@ fn parse_joins_on() {
30123018
relation: TableFactor::Table {
30133019
name: ObjectName(vec![Ident::new(relation.into())]),
30143020
alias,
3015-
args: vec![],
3021+
args: None,
30163022
with_hints: vec![],
30173023
},
30183024
join_operator: f(JoinConstraint::On(Expr::BinaryOp {
@@ -3065,7 +3071,7 @@ fn parse_joins_using() {
30653071
relation: TableFactor::Table {
30663072
name: ObjectName(vec![Ident::new(relation.into())]),
30673073
alias,
3068-
args: vec![],
3074+
args: None,
30693075
with_hints: vec![],
30703076
},
30713077
join_operator: f(JoinConstraint::Using(vec!["c1".into()])),
@@ -3110,7 +3116,7 @@ fn parse_natural_join() {
31103116
relation: TableFactor::Table {
31113117
name: ObjectName(vec![Ident::new("t2")]),
31123118
alias: None,
3113-
args: vec![],
3119+
args: None,
31143120
with_hints: vec![],
31153121
},
31163122
join_operator: f(JoinConstraint::Natural),
@@ -3348,7 +3354,7 @@ fn parse_derived_tables() {
33483354
relation: TableFactor::Table {
33493355
name: ObjectName(vec!["t2".into()]),
33503356
alias: None,
3351-
args: vec![],
3357+
args: None,
33523358
with_hints: vec![],
33533359
},
33543360
join_operator: JoinOperator::Inner(JoinConstraint::Natural),
@@ -4431,7 +4437,7 @@ fn parse_merge() {
44314437
name: Ident::new("dest"),
44324438
columns: vec![]
44334439
}),
4434-
args: vec![],
4440+
args: None,
44354441
with_hints: vec![]
44364442
}
44374443
);
@@ -4452,7 +4458,7 @@ fn parse_merge() {
44524458
relation: TableFactor::Table {
44534459
name: ObjectName(vec![Ident::new("s"), Ident::new("foo")]),
44544460
alias: None,
4455-
args: vec![],
4461+
args: None,
44564462
with_hints: vec![]
44574463
},
44584464
joins: vec![]

tests/sqlparser_mysql.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ fn parse_update_with_joins() {
626626
name: Ident::new("o"),
627627
columns: vec![]
628628
}),
629-
args: vec![],
629+
args: None,
630630
with_hints: vec![],
631631
},
632632
joins: vec![Join {
@@ -636,7 +636,7 @@ fn parse_update_with_joins() {
636636
name: Ident::new("c"),
637637
columns: vec![]
638638
}),
639-
args: vec![],
639+
args: None,
640640
with_hints: vec![],
641641
},
642642
join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
@@ -743,7 +743,7 @@ fn parse_substring_in_select() {
743743
quote_style: None
744744
}]),
745745
alias: None,
746-
args: vec![],
746+
args: None,
747747
with_hints: vec![]
748748
},
749749
joins: vec![]

tests/sqlparser_postgres.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ fn parse_update_set_from() {
413413
relation: TableFactor::Table {
414414
name: ObjectName(vec![Ident::new("t1")]),
415415
alias: None,
416-
args: vec![],
416+
args: None,
417417
with_hints: vec![],
418418
},
419419
joins: vec![],
@@ -439,7 +439,7 @@ fn parse_update_set_from() {
439439
relation: TableFactor::Table {
440440
name: ObjectName(vec![Ident::new("t1")]),
441441
alias: None,
442-
args: vec![],
442+
args: None,
443443
with_hints: vec![],
444444
},
445445
joins: vec![],

tests/sqlparser_redshift.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn test_square_brackets_over_db_schema_table_name() {
4343
}
4444
]),
4545
alias: None,
46-
args: vec![],
46+
args: None,
4747
with_hints: vec![],
4848
},
4949
joins: vec![],
@@ -87,7 +87,7 @@ fn test_double_quotes_over_db_schema_table_name() {
8787
}
8888
]),
8989
alias: None,
90-
args: vec![],
90+
args: None,
9191
with_hints: vec![],
9292
},
9393
joins: vec![],

tests/sqpparser_clickhouse.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fn parse_map_access_expr() {
5858
relation: Table {
5959
name: ObjectName(vec![Ident::new("foos")]),
6060
alias: None,
61-
args: vec![],
61+
args: None,
6262
with_hints: vec![],
6363
},
6464
joins: vec![]

0 commit comments

Comments
 (0)