@@ -3,8 +3,9 @@ use sqruff_lib_core::dialects::init::DialectKind;
3
3
use sqruff_lib_core:: dialects:: syntax:: SyntaxKind ;
4
4
use sqruff_lib_core:: helpers:: { Config , ToMatchable } ;
5
5
use sqruff_lib_core:: parser:: grammar:: anyof:: { AnyNumberOf , one_of} ;
6
- use sqruff_lib_core:: parser:: grammar:: base:: Ref ;
6
+ use sqruff_lib_core:: parser:: grammar:: base:: { Anything , Ref } ;
7
7
use sqruff_lib_core:: parser:: grammar:: delimited:: Delimited ;
8
+ use sqruff_lib_core:: parser:: grammar:: sequence:: Bracketed ;
8
9
use sqruff_lib_core:: parser:: parsers:: TypedParser ;
9
10
use sqruff_lib_core:: parser:: segments:: meta:: MetaSegment ;
10
11
use sqruff_lib_core:: vec_of_erased;
@@ -99,6 +100,77 @@ pub fn raw_dialect() -> Dialect {
99
100
. to_matchable ( )
100
101
. into ( ) ,
101
102
) ,
103
+ (
104
+ // A column definition, e.g. for CREATE TABLE or ALTER TABLE.
105
+ "ColumnDefinitionSegment" . into ( ) ,
106
+ Sequence :: new ( vec_of_erased ! [
107
+ Ref :: new( "SingleIdentifierGrammar" ) , // Column name
108
+ one_of( vec_of_erased![
109
+ // DATETIME and TIMESTAMP take special logic
110
+ Ref :: new( "DatatypeSegment" ) . exclude( one_of( vec_of_erased![
111
+ Ref :: keyword( "DATETIME" ) ,
112
+ Ref :: keyword( "TIMESTAMP" ) ,
113
+ ] ) ) ,
114
+ Sequence :: new( vec_of_erased![
115
+ one_of( vec_of_erased![
116
+ Ref :: keyword( "DATETIME" ) ,
117
+ Ref :: keyword( "TIMESTAMP" ) ,
118
+ ] ) ,
119
+ Bracketed :: new( vec_of_erased![ Ref :: new( "NumericLiteralSegment" ) , ] )
120
+ . config( |bracketed| bracketed. optional( ) ) , // Precision
121
+ AnyNumberOf :: new( vec_of_erased![
122
+ // Allow NULL/NOT NULL, DEFAULT, and ON UPDATE in any order
123
+ Sequence :: new( vec_of_erased![
124
+ Sequence :: new( vec_of_erased![ Ref :: keyword( "NOT" ) , ] )
125
+ . config( |sequence| sequence. optional( ) ) ,
126
+ Ref :: keyword( "NULL" ) ,
127
+ ] )
128
+ . config( |sequence| sequence. optional( ) ) ,
129
+ Sequence :: new( vec_of_erased![
130
+ Ref :: keyword( "DEFAULT" ) ,
131
+ one_of( vec_of_erased![
132
+ Sequence :: new( vec_of_erased![
133
+ one_of( vec_of_erased![
134
+ Ref :: keyword( "CURRENT_TIMESTAMP" ) ,
135
+ Ref :: keyword( "NOW" ) ,
136
+ ] ) ,
137
+ Bracketed :: new( vec_of_erased![
138
+ Ref :: new( "NumericLiteralSegment" ) . optional( )
139
+ ] )
140
+ . config( |bracketed| bracketed. optional( ) ) ,
141
+ ] ) ,
142
+ Ref :: new( "NumericLiteralSegment" ) ,
143
+ Ref :: new( "QuotedLiteralSegment" ) ,
144
+ Ref :: keyword( "NULL" ) ,
145
+ ] ) ,
146
+ ] )
147
+ . config( |sequence| sequence. optional( ) ) ,
148
+ Sequence :: new( vec_of_erased![
149
+ Ref :: keyword( "ON" ) ,
150
+ Ref :: keyword( "UPDATE" ) ,
151
+ one_of( vec_of_erased![
152
+ Ref :: keyword( "CURRENT_TIMESTAMP" ) ,
153
+ Ref :: keyword( "NOW" ) ,
154
+ ] ) ,
155
+ Bracketed :: new( vec_of_erased![
156
+ Ref :: new( "NumericLiteralSegment" ) . optional( )
157
+ ] )
158
+ . config( |bracketed| bracketed. optional( ) ) ,
159
+ ] )
160
+ . config( |sequence| sequence. optional( ) ) ,
161
+ ] )
162
+ . config( |any_number| any_number. optional( ) ) ,
163
+ ] ) ,
164
+ ] ) ,
165
+ Bracketed :: new( vec_of_erased![ Anything :: new( ) , ] )
166
+ . config( |bracketed| bracketed. optional( ) ) , // For types like VARCHAR(100)
167
+ AnyNumberOf :: new( vec_of_erased![
168
+ Ref :: new( "ColumnConstraintSegment" ) . optional( ) ,
169
+ ] ) ,
170
+ ] )
171
+ . to_matchable ( )
172
+ . into ( ) ,
173
+ ) ,
102
174
(
103
175
// This is a CLOSE or Open statement.
104
176
// https://dev.mysql.com/doc/refman/8.0/en/close.html
0 commit comments