File tree Expand file tree Collapse file tree 4 files changed +124
-12
lines changed Expand file tree Collapse file tree 4 files changed +124
-12
lines changed Original file line number Diff line number Diff line change @@ -948,12 +948,6 @@ pub trait Dialect: Debug + Any {
948
948
keywords:: RESERVED_FOR_IDENTIFIER . contains ( & kw)
949
949
}
950
950
951
- /// Returns reserved keywords when looking to parse a `TableFactor`.
952
- /// See [Self::supports_from_trailing_commas]
953
- fn get_reserved_keywords_for_table_factor ( & self ) -> & [ Keyword ] {
954
- keywords:: RESERVED_FOR_TABLE_FACTOR
955
- }
956
-
957
951
/// Returns reserved keywords that may prefix a select item expression
958
952
/// e.g. `SELECT CONNECT_BY_ROOT name FROM Tbl2` (Snowflake)
959
953
fn get_reserved_keywords_for_select_item_operator ( & self ) -> & [ Keyword ] {
@@ -1012,7 +1006,13 @@ pub trait Dialect: Debug + Any {
1012
1006
explicit || self . is_column_alias ( kw, parser)
1013
1007
}
1014
1008
1015
- /// Returns true if the specified keyword should be parsed as a table identifier.
1009
+ /// Returns true if the specified keyword should be parsed as a table factor identifier.
1010
+ /// See [keywords::RESERVED_FOR_TABLE_FACTOR]
1011
+ fn is_table_factor ( & self , kw : & Keyword , _parser : & mut Parser ) -> bool {
1012
+ !keywords:: RESERVED_FOR_TABLE_FACTOR . contains ( kw)
1013
+ }
1014
+
1015
+ /// Returns true if the specified keyword should be parsed as a table factor alias.
1016
1016
/// See [keywords::RESERVED_FOR_TABLE_ALIAS]
1017
1017
fn is_table_alias ( & self , kw : & Keyword , _parser : & mut Parser ) -> bool {
1018
1018
!keywords:: RESERVED_FOR_TABLE_ALIAS . contains ( kw)
Original file line number Diff line number Diff line change @@ -45,6 +45,82 @@ use super::keywords::RESERVED_FOR_IDENTIFIER;
45
45
use sqlparser:: ast:: StorageSerializationPolicy ;
46
46
47
47
const RESERVED_KEYWORDS_FOR_SELECT_ITEM_OPERATOR : [ Keyword ; 1 ] = [ Keyword :: CONNECT_BY_ROOT ] ;
48
+
49
+ // See: <https://docs.snowflake.com/en/sql-reference/reserved-keywords>
50
+ const RESERVED_KEYWORDS_FOR_TABLE_FACTOR : & [ Keyword ] = & [
51
+ Keyword :: ALL ,
52
+ Keyword :: ALTER ,
53
+ Keyword :: AND ,
54
+ Keyword :: ANY ,
55
+ Keyword :: AS ,
56
+ Keyword :: BETWEEN ,
57
+ Keyword :: BY ,
58
+ Keyword :: CHECK ,
59
+ Keyword :: COLUMN ,
60
+ Keyword :: CONNECT ,
61
+ Keyword :: CREATE ,
62
+ Keyword :: CROSS ,
63
+ Keyword :: CURRENT ,
64
+ Keyword :: DELETE ,
65
+ Keyword :: DISTINCT ,
66
+ Keyword :: DROP ,
67
+ Keyword :: ELSE ,
68
+ Keyword :: EXISTS ,
69
+ Keyword :: FOLLOWING ,
70
+ Keyword :: FOR ,
71
+ Keyword :: FROM ,
72
+ Keyword :: FULL ,
73
+ Keyword :: GRANT ,
74
+ Keyword :: GROUP ,
75
+ Keyword :: HAVING ,
76
+ Keyword :: ILIKE ,
77
+ Keyword :: IN ,
78
+ Keyword :: INCREMENT ,
79
+ Keyword :: INNER ,
80
+ Keyword :: INSERT ,
81
+ Keyword :: INTERSECT ,
82
+ Keyword :: INTO ,
83
+ Keyword :: IS ,
84
+ Keyword :: JOIN ,
85
+ Keyword :: LEFT ,
86
+ Keyword :: LIKE ,
87
+ Keyword :: MINUS ,
88
+ Keyword :: NATURAL ,
89
+ Keyword :: NOT ,
90
+ Keyword :: NULL ,
91
+ Keyword :: OF ,
92
+ Keyword :: ON ,
93
+ Keyword :: OR ,
94
+ Keyword :: ORDER ,
95
+ Keyword :: QUALIFY ,
96
+ Keyword :: REGEXP ,
97
+ Keyword :: REVOKE ,
98
+ Keyword :: RIGHT ,
99
+ Keyword :: RLIKE ,
100
+ Keyword :: ROW ,
101
+ Keyword :: ROWS ,
102
+ Keyword :: SAMPLE ,
103
+ Keyword :: SELECT ,
104
+ Keyword :: SET ,
105
+ Keyword :: SOME ,
106
+ Keyword :: START ,
107
+ Keyword :: TABLE ,
108
+ Keyword :: TABLESAMPLE ,
109
+ Keyword :: THEN ,
110
+ Keyword :: TO ,
111
+ Keyword :: TRIGGER ,
112
+ Keyword :: UNION ,
113
+ Keyword :: UNIQUE ,
114
+ Keyword :: UPDATE ,
115
+ Keyword :: USING ,
116
+ Keyword :: VALUES ,
117
+ Keyword :: WHEN ,
118
+ Keyword :: WHENEVER ,
119
+ Keyword :: WHERE ,
120
+ Keyword :: WINDOW ,
121
+ Keyword :: WITH ,
122
+ ] ;
123
+
48
124
/// A [`Dialect`] for [Snowflake](https://www.snowflake.com/)
49
125
#[ derive( Debug , Default ) ]
50
126
pub struct SnowflakeDialect ;
@@ -427,6 +503,21 @@ impl Dialect for SnowflakeDialect {
427
503
}
428
504
}
429
505
506
+ fn is_table_factor ( & self , kw : & Keyword , parser : & mut Parser ) -> bool {
507
+ match kw {
508
+ Keyword :: LIMIT
509
+ if matches ! (
510
+ parser. peek_token( ) . token,
511
+ Token :: Number ( _, _) | Token :: Placeholder ( _)
512
+ ) =>
513
+ {
514
+ false
515
+ }
516
+
517
+ _ => !RESERVED_KEYWORDS_FOR_TABLE_FACTOR . contains ( kw) ,
518
+ }
519
+ }
520
+
430
521
/// See: <https://docs.snowflake.com/en/sql-reference/constructs/at-before>
431
522
fn supports_timestamp_versioning ( & self ) -> bool {
432
523
true
Original file line number Diff line number Diff line change @@ -4369,11 +4369,7 @@ impl<'a> Parser<'a> {
4369
4369
self.parse_comma_separated_with_trailing_commas(
4370
4370
Parser::parse_table_and_joins,
4371
4371
trailing_commas,
4372
- |kw, _parser| {
4373
- self.dialect
4374
- .get_reserved_keywords_for_table_factor()
4375
- .contains(kw)
4376
- },
4372
+ |kw, parser| !self.dialect.is_table_factor(kw, parser),
4377
4373
)
4378
4374
}
4379
4375
Original file line number Diff line number Diff line change @@ -3543,6 +3543,18 @@ fn test_sql_keywords_as_table_aliases() {
3543
3543
}
3544
3544
}
3545
3545
3546
+ #[ test]
3547
+ fn test_sql_keywords_as_table_factor ( ) {
3548
+ // LIMIT is a table factor, Snowflake does not reserve it
3549
+ snowflake ( ) . one_statement_parses_to ( "SELECT * FROM tbl, LIMIT" , "SELECT * FROM tbl, LIMIT" ) ;
3550
+ // LIMIT is not a table factor
3551
+ snowflake ( ) . one_statement_parses_to ( "SELECT * FROM tbl, LIMIT 1" , "SELECT * FROM tbl LIMIT 1" ) ;
3552
+ // ORDER is reserved
3553
+ assert ! ( snowflake( )
3554
+ . parse_sql_statements( "SELECT * FROM tbl, order" )
3555
+ . is_err( ) ) ;
3556
+ }
3557
+
3546
3558
#[ test]
3547
3559
fn test_timetravel_at_before ( ) {
3548
3560
snowflake ( ) . verified_only_select ( "SELECT * FROM tbl AT(TIMESTAMP => '2024-12-15 00:00:00')" ) ;
@@ -4438,3 +4450,16 @@ fn test_snowflake_identifier_function() {
4438
4450
true
4439
4451
) ;
4440
4452
}
4453
+
4454
+ #[ test]
4455
+ fn test_x ( ) {
4456
+ println ! (
4457
+ "{:#?}" ,
4458
+ snowflake( )
4459
+ . parse_sql_statements(
4460
+ r#"
4461
+ SELECT email from customers, order by 1"#
4462
+ )
4463
+ . unwrap( )
4464
+ ) ;
4465
+ }
You can’t perform that action at this time.
0 commit comments