Skip to content

Commit 4e2b025

Browse files
committed
making progress [ci skip]
1 parent d846411 commit 4e2b025

File tree

6 files changed

+134
-61
lines changed

6 files changed

+134
-61
lines changed

crates/lib-dialects/src/mysql.rs

+73-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use sqruff_lib_core::dialects::init::DialectKind;
33
use sqruff_lib_core::dialects::syntax::SyntaxKind;
44
use sqruff_lib_core::helpers::{Config, ToMatchable};
55
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};
77
use sqruff_lib_core::parser::grammar::delimited::Delimited;
8+
use sqruff_lib_core::parser::grammar::sequence::Bracketed;
89
use sqruff_lib_core::parser::parsers::TypedParser;
910
use sqruff_lib_core::parser::segments::meta::MetaSegment;
1011
use sqruff_lib_core::vec_of_erased;
@@ -99,6 +100,77 @@ pub fn raw_dialect() -> Dialect {
99100
.to_matchable()
100101
.into(),
101102
),
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+
),
102174
(
103175
// This is a CLOSE or Open statement.
104176
// https://dev.mysql.com/doc/refman/8.0/en/close.html

crates/lib-dialects/src/mysql_keywords.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -777,10 +777,11 @@ XID
777777
XML
778778
YEAR
779779
ZONE
780+
NOW
780781
SHARED
781782
INPLACE
782783
NOCOPY
783784
INSTANT
784785
";
785786
// These are not all MySQL keywords, but sqruff needs them to parse well.
786-
// Anything past SHARED is not a MySQL keyword.
787+
// Anything past NOW and including NOW is not a MySQL keyword.

crates/lib-dialects/test/fixtures/dialects/mysql/create_table_equals_optional.yml

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ file:
77
- naked_identifier: a
88
- bracketed:
99
- start_bracket: (
10-
- column_definition:
11-
- naked_identifier: id
12-
- data_type:
13-
- data_type_identifier: INT
10+
- naked_identifier: id
11+
- data_type:
12+
- data_type_identifier: INT
1413
- end_bracket: )
1514
- file:
1615
- word: COLLATE
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,48 @@
11
file:
2-
- unparsable:
3-
- word: CREATE
4-
- word: TABLE
5-
- word: IF
6-
- word: NOT
7-
- word: EXISTS
8-
- word: db_name
9-
- dot: .
10-
- word: table_name
11-
- start_bracket: (
12-
- word: updated_at1
13-
- word: timestamp
14-
- word: default
15-
- word: CURRENT_TIMESTAMP
16-
- word: not
17-
- word: 'null'
18-
- word: on
19-
- word: update
20-
- word: CURRENT_TIMESTAMP
21-
- comma: ','
22-
- word: updated_at2
23-
- word: timestamp
24-
- word: not
25-
- word: 'null'
26-
- word: default
27-
- word: CURRENT_TIMESTAMP
28-
- word: on
29-
- word: update
30-
- word: CURRENT_TIMESTAMP
31-
- comma: ','
32-
- word: updated_at3
33-
- word: timestamp
34-
- word: default
35-
- word: CURRENT_TIMESTAMP
36-
- word: on
37-
- word: update
38-
- word: CURRENT_TIMESTAMP
39-
- word: not
40-
- word: 'null'
41-
- comma: ','
42-
- word: updated_at4
43-
- word: timestamp
44-
- end_bracket: )
45-
- semicolon: ;
2+
- statement:
3+
- create_table_statement:
4+
- keyword: CREATE
5+
- keyword: TABLE
6+
- keyword: IF
7+
- keyword: NOT
8+
- keyword: EXISTS
9+
- table_reference:
10+
- naked_identifier: db_name
11+
- dot: .
12+
- naked_identifier: table_name
13+
- bracketed:
14+
- start_bracket: (
15+
- naked_identifier: updated_at1
16+
- keyword: timestamp
17+
- keyword: default
18+
- keyword: CURRENT_TIMESTAMP
19+
- keyword: not
20+
- keyword: 'null'
21+
- keyword: on
22+
- keyword: update
23+
- keyword: CURRENT_TIMESTAMP
24+
- comma: ','
25+
- naked_identifier: updated_at2
26+
- keyword: timestamp
27+
- keyword: not
28+
- keyword: 'null'
29+
- keyword: default
30+
- keyword: CURRENT_TIMESTAMP
31+
- keyword: on
32+
- keyword: update
33+
- keyword: CURRENT_TIMESTAMP
34+
- comma: ','
35+
- naked_identifier: updated_at3
36+
- keyword: timestamp
37+
- keyword: default
38+
- keyword: CURRENT_TIMESTAMP
39+
- keyword: on
40+
- keyword: update
41+
- keyword: CURRENT_TIMESTAMP
42+
- keyword: not
43+
- keyword: 'null'
44+
- comma: ','
45+
- naked_identifier: updated_at4
46+
- keyword: timestamp
47+
- end_bracket: )
48+
- statement_terminator: ;

crates/lib-dialects/test/fixtures/dialects/mysql/create_table_primary_foreign_keys.yml

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ file:
77
- naked_identifier: parent
88
- bracketed:
99
- start_bracket: (
10-
- column_definition:
11-
- naked_identifier: id
12-
- data_type:
13-
- data_type_identifier: INT
14-
- column_constraint_segment:
15-
- keyword: NOT
16-
- keyword: 'NULL'
10+
- naked_identifier: id
11+
- data_type:
12+
- data_type_identifier: INT
13+
- column_constraint_segment:
14+
- keyword: NOT
15+
- keyword: 'NULL'
1716
- comma: ','
1817
- table_constraint:
1918
- keyword: PRIMARY

crates/lib-dialects/test/fixtures/dialects/mysql/json.yml

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ file:
77
- naked_identifier: facts
88
- bracketed:
99
- start_bracket: (
10-
- column_definition:
11-
- naked_identifier: sentence
12-
- data_type:
13-
- data_type_identifier: JSON
10+
- naked_identifier: sentence
11+
- data_type:
12+
- data_type_identifier: JSON
1413
- end_bracket: )
1514
- statement_terminator: ;
1615
- statement:

0 commit comments

Comments
 (0)