11use sqruff_lib_core:: dialects:: base:: Dialect ;
22use sqruff_lib_core:: dialects:: init:: DialectKind ;
33use sqruff_lib_core:: dialects:: syntax:: SyntaxKind ;
4- use sqruff_lib_core:: helpers:: Config ;
5- use sqruff_lib_core:: parser:: lexer:: Matcher ;
4+ use sqruff_lib_core:: helpers:: { Config , ToMatchable } ;
5+ use sqruff_lib_core:: parser:: grammar:: anyof:: one_of;
6+ use sqruff_lib_core:: parser:: grammar:: base:: Ref ;
7+ use sqruff_lib_core:: parser:: segments:: meta:: MetaSegment ;
8+ use sqruff_lib_core:: vec_of_erased;
9+ use sqruff_lib_core:: { parser:: grammar:: sequence:: Sequence , parser:: lexer:: Matcher } ;
10+
11+ use crate :: mysql_keywords:: { MYSQL_RESERVED_KEYWORDS , MYSQL_UNRESERVED_KEYWORDS } ;
612
713use super :: ansi;
814
@@ -20,5 +26,68 @@ pub fn raw_dialect() -> Dialect {
2026 SyntaxKind :: InlineComment ,
2127 ) ] ) ;
2228
29+ // # Set Keywords
30+ // Do not clear inherited unreserved ansi keywords. Too many are needed to parse well.
31+ // Just add MySQL unreserved keywords.
32+ mysql. update_keywords_set_from_multiline_string (
33+ "unreserved_keywords" ,
34+ MYSQL_UNRESERVED_KEYWORDS ,
35+ ) ;
36+ mysql. sets ( "reserved_keywords" ) . clear ( ) ;
37+ mysql. update_keywords_set_from_multiline_string ( "reserved_keywords" , MYSQL_RESERVED_KEYWORDS ) ;
38+
39+ // Set the datetime units
40+ mysql. sets_mut ( "datetime_units" ) . clear ( ) ;
41+ mysql. sets_mut ( "datetime_units" ) . extend ( vec ! [
42+ // https://github.com/mysql/mysql-server/blob/1bfe02bdad6604d54913c62614bde57a055c8332/sql/sql_yacc.yy#L12321-L12345
43+ // interval:
44+ "DAY_HOUR" ,
45+ "DAY_MICROSECOND" ,
46+ "DAY_MINUTE" ,
47+ "DAY_SECOND" ,
48+ "HOUR_MICROSECOND" ,
49+ "HOUR_MINUTE" ,
50+ "HOUR_SECOND" ,
51+ "MINUTE_MICROSECOND" ,
52+ "MINUTE_SECOND" ,
53+ "SECOND_MICROSECOND" ,
54+ "YEAR_MONTH" ,
55+ // interval_time_stamp
56+ "DAY" ,
57+ "WEEK" ,
58+ "HOUR" ,
59+ "MINUTE" ,
60+ "MONTH" ,
61+ "QUARTER" ,
62+ "SECOND" ,
63+ "MICROSECOND" ,
64+ "YEAR" ,
65+ ] ) ;
66+
67+ mysql. sets_mut ( "date_part_function_name" ) . clear ( ) ;
68+ mysql. sets_mut ( "date_part_function_name" ) . extend ( vec ! [
69+ "EXTRACT" ,
70+ "TIMESTAMPADD" ,
71+ "TIMESTAMPDIFF" ,
72+ ] ) ;
73+
74+ mysql. add ( [ (
75+ // A reference to an object with an `AS` clause.
76+ // The optional AS keyword allows both implicit and explicit aliasing.
77+ "AliasExpressionSegment" . into ( ) ,
78+ Sequence :: new ( vec_of_erased ! [
79+ MetaSegment :: indent( ) ,
80+ Ref :: keyword( "AS" ) . optional( ) ,
81+ one_of( vec_of_erased![
82+ Ref :: new( "SingleIdentifierGrammar" ) ,
83+ Ref :: new( "SingleQuotedIdentifierSegment" ) ,
84+ Ref :: new( "DoubleQuotedIdentifierSegment" ) ,
85+ ] ) ,
86+ MetaSegment :: dedent( ) ,
87+ ] )
88+ . to_matchable ( )
89+ . into ( ) ,
90+ ) ] ) ;
91+
2392 mysql
2493}
0 commit comments