Skip to content

Commit 3a1b40e

Browse files
committed
refactor: update mysql reserved word
1 parent 6193f04 commit 3a1b40e

3 files changed

Lines changed: 262 additions & 25 deletions

File tree

pegjs/mysql.pegjs

Lines changed: 202 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,94 +6,275 @@
66
'AND': true,
77
'AS': true,
88
'ASC': true,
9+
'ANALYZE': true,
10+
'ACCESSIBLE': true,
911

12+
'BEFORE': true,
1013
'BETWEEN': true,
14+
'BIGINT': true,
15+
'BLOB': true,
16+
'BOTH': true,
1117
'BY': true,
1218

1319
'CALL': true,
20+
'CASCADE': true,
1421
'CASE': true,
1522
'CREATE': true,
16-
'CONTAINS': true,
23+
'CHAR': true,
24+
'CHECK': true,
25+
'COLLATE': true,
26+
// 'COLUMN': true,
27+
'CONDITION': true,
28+
'CONSTRAINT': true,
29+
'CONTINUE': true,
30+
'CONVERT': true,
31+
'CREATE': true,
32+
'CROSS': true,
1733
'CURRENT_DATE': true,
1834
'CURRENT_TIME': true,
1935
'CURRENT_TIMESTAMP': true,
2036
'CURRENT_USER': true,
21-
37+
'CURSOR': true,
38+
39+
'DATABASE': true,
40+
'DATABASES': true,
41+
'DAY_HOUR': true,
42+
'DAY_MICROSECOND': true,
43+
'DAY_MINUTE': true,
44+
'DAY_SECOND': true,
45+
'DEC': true,
46+
'DECIMAL': true,
47+
'DECLARE': true,
48+
'DEFAULT': true,
49+
'DELAYED': true,
2250
'DELETE': true,
2351
'DESC': true,
52+
'DESCRIBE': true,
53+
'DETERMINISTIC': true,
2454
'DISTINCT': true,
55+
'DISTINCTROW': true,
56+
'DIV': true,
2557
'DROP': true,
58+
'DOUBLE': true,
59+
'DUAL': true,
2660

2761
'ELSE': true,
28-
'END': true,
62+
'EACH': true,
63+
'ELSEIF': true,
64+
'ENCLOSED': true,
65+
'ESCAPED': true,
66+
'EXCEPT': true,
2967
'EXISTS': true,
68+
'EXIT': true,
3069
'EXPLAIN': true,
3170

3271
'FALSE': true,
33-
'FROM': true,
3472
'FULL': true,
35-
73+
'FROM': true,
74+
'FETCH': true,
75+
'FLOAT': true,
76+
'FLOAT4': true,
77+
'FLOAT8': true,
78+
'FOR': true,
79+
'FORCE': true,
80+
'FOREIGN': true,
81+
'FULLTEXT': true,
82+
'FUNCTION': true,
83+
84+
'GENERATED': true,
85+
'GET': true,
86+
'GRANT': true,
3687
'GROUP': true,
88+
'GROUPING': true,
89+
'GROUPS': true,
3790

3891
'HAVING': true,
92+
'HIGH_PRIORITY': true,
93+
'HOUR_MICROSECOND': true,
94+
'HOUR_MINUTE': true,
95+
'HOUR_SECOND': true,
3996

97+
// 'IF': true,
98+
'IGNORE': true,
4099
'IN': true,
41100
'INNER': true,
101+
'INFILE': true,
102+
'INOUT': true,
103+
'INSENSITIVE': true,
42104
'INSERT': true,
105+
'INT': true,
106+
'INT1': true,
107+
'INT2': true,
108+
'INT3': true,
109+
'INT4': true,
110+
'INT8': true,
111+
'INTEGER': true,
112+
'INTERVAL': true,
43113
'INTO': true,
114+
'IO_AFTER_GTIDS': true,
115+
'IO_BEFORE_GTIDS': true,
44116
'IS': true,
117+
'ITERATE': true,
45118

46119
'JOIN': true,
47-
'JSON': true,
120+
'JSON_TABLE': true,
48121

49122
'KEY': true,
50-
123+
'KEYS': true,
124+
'KILL': true,
125+
126+
'LAG': true, // added in 8.0.2 (reserved)
127+
'LAST_VALUE': true,
128+
'LATERAL': true,
129+
'LEAD': true,
130+
'LEADING': true,
131+
'LEAVE': true,
51132
'LEFT': true,
52133
'LIKE': true,
53134
'LIMIT': true,
135+
'LINEAR': true,
136+
'LINES': true,
137+
'LOAD': true,
138+
'LOCALTIME': true,
139+
'LOCALTIMESTAMP': true,
140+
'LOCK': true,
141+
'LONG': true,
142+
'LONGBLOB': true,
143+
'LONGTEXT': true,
144+
'LOOP': true,
54145
'LOW_PRIORITY': true, // for lock table
55146

147+
'MASTER_BIND': true,
148+
'MATCH': true,
149+
'MAXVALUE': true,
150+
'MEDIUMBLOB': true,
151+
'MEDIUMINT': true,
152+
'MEDIUMTEXT': true,
153+
'MIDDLEINT': true,
154+
'MINUTE_MICROSECOND': true,
155+
'MINUTE_SECOND': true,
156+
'MOD': true,
157+
'MODIFIES': true,
158+
159+
160+
'NATURAL': true,
56161
'NOT': true,
162+
'NO_WRITE_TO_BINLOG': true,
163+
'NTH_VALUE': true, // added in 8.0.2 (reserved)
164+
'NTILE': true, // added in 8.0.2 (reserved)
57165
'NULL': true,
166+
'NUMERIC': true,
58167

168+
'OF': true, // added in 8.0.1 (reserved)
59169
'ON': true,
170+
'OPTIMIZE': true,
171+
'OPTIMIZER_COSTS': true,
172+
'OPTION': true,
173+
'OPTIONALLY': true,
60174
'OR': true,
61175
'ORDER': true,
176+
'OUT': true,
62177
'OUTER': true,
63-
178+
'OUTFILE': true,
179+
'OVER': true, // added in 8.0.2 (reserved)
180+
181+
'PARTITION': true,
182+
'PERCENT_RANK': true, // added in 8.0.2 (reserved)
183+
'PRECISION': true,
184+
'PRIMARY': true,
185+
'PROCEDURE': true,
186+
'PURGE': true,
187+
188+
'RANGE': true,
189+
'RANK': true, // added in 8.0.2 (reserved)
190+
'READ': true, // for lock table
191+
'READS': true, // for lock table
192+
'READ_WRITE': true, // for lock table
193+
'REAL': true, // for lock table
64194
'RECURSIVE': true,
195+
'REFERENCES': true,
196+
'REGEXP': true,
197+
'RELEASE': true,
65198
'RENAME': true,
66-
'READ': true, // for lock table
199+
'REPEAT': true,
200+
'REPLACE': true,
201+
'REQUIRE': true,
202+
'RESIGNAL': true,
203+
'RESTRICT': true,
204+
'RETURN': true,
205+
'REVOKE': true,
67206
'RIGHT': true,
207+
'RLIKE': true,
208+
'ROW': true, // // added in 8.0.2 (reserved)
209+
'ROWS': true, // // added in 8.0.2 (reserved)
210+
'ROW_NUMBER': true, // // added in 8.0.2 (reserved)
68211

212+
'SCHEMA': true,
213+
'SCHEMAS': true,
69214
'SELECT': true,
70-
'SESSION_USER': true,
215+
'SENSITIVE': true,
216+
'SEPARATOR': true,
71217
'SET': true,
72218
'SHOW': true,
73-
'SYSTEM_USER': true,
219+
'SIGNAL': true,
220+
'SMALLINT': true,
221+
'SPATIAL': true,
222+
'SPECIFIC': true,
223+
'SQL': true,
224+
'SQLEXCEPTION': true,
225+
'SQLSTATE': true,
226+
'SQLWARNING': true,
227+
'SQL_BIG_RESULT': true,
228+
// 'SQL_CALC_FOUND_ROWS': true,
229+
// 'SQL_SMALL_RESULT': true,
230+
'SSL': true,
231+
'STARTING': true,
232+
'STORED': true,
233+
'STRAIGHT_JOIN': true,
234+
'SYSTEM': true,
74235

75236
'TABLE': true,
237+
'TERMINATED': true,
76238
'THEN': true,
239+
'TINYBLOB': true,
240+
'TINYINT': true,
241+
'TINYTEXT': true,
242+
'TO': true,
243+
'TRAILING': true,
244+
'TRIGGER': true,
77245
'TRUE': true,
78-
'TRUNCATE': true,
79-
// 'TYPE': true, // reserved (MySQL)
80246

81247
'UNION': true,
248+
'UNIQUE': true,
249+
'UNLOCK': true,
250+
'UNSIGNED': true,
82251
'UPDATE': true,
252+
'USAGE': true,
253+
'USE': true,
83254
'USING': true,
255+
'UTC_DATE': true,
256+
'UTC_TIME': true,
257+
'UTC_TIMESTAMP': true,
84258

85259
'VALUES': true,
260+
'VARBINARY': true,
261+
'VARCHAR': true,
262+
'VARCHARACTER': true,
263+
'VARYING': true,
264+
'VIRTUAL': true,
86265

87-
'WITH': true,
88266
'WHEN': true,
89267
'WHERE': true,
268+
'WHILE': true,
269+
'WINDOW': true, // added in 8.0.2 (reserved)
270+
'WITH': true,
90271
'WRITE': true, // for lock table
91272

92-
'GLOBAL': true,
93-
'SESSION': true,
94-
'LOCAL': true,
95-
'PERSIST': true,
96-
'PERSIST_ONLY': true,
273+
'XOR': true,
274+
275+
'YEAR_MONTH': true,
276+
277+
'ZEROFILL': true,
97278
};
98279

99280
function createUnaryExpr(op, e) {
@@ -2659,7 +2840,8 @@ proc_func_name
26592840
}
26602841
return name;
26612842
}
2662-
/ KW_LEFT { return 'LEFT' }
2843+
/ ident_name
2844+
/ quoted_ident
26632845

26642846
proc_func_call
26652847
= name:proc_func_name __ LPAREN __ l:proc_primary_list? __ RPAREN {

test/ast.spec.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe('AST', () => {
1818
expect(getParsedSql('SELECT SQL_CALC_FOUND_ROWS SQL_BUFFER_RESULT col1 FROM t'))
1919
.to.equal('SELECT SQL_CALC_FOUND_ROWS SQL_BUFFER_RESULT `col1` FROM `t`');
2020
});
21-
it('should support MySQL query options', () => {
21+
it('should support MySQL query options function', () => {
2222
expect(getParsedSql(`SELECT xx.dd, Max(IF(stat_key = 'yys', stat_us, 0)) AS 'yys_users' FROM waf.t_cpkg WHERE stat_ty = 'waf_ty' GROUP BY dd;`))
2323
.to.equal("SELECT `xx`.`dd`, MAX(IF(`stat_key` = 'yys', `stat_us`, 0)) AS `yys_users` FROM `waf`.`t_cpkg` WHERE `stat_ty` = 'waf_ty' GROUP BY `dd`");
2424
});
@@ -521,13 +521,19 @@ describe('AST', () => {
521521
.to.equal('SELECT `col1` FROM `t` WHERE `col2` IN (1, 3, 5, 7)');
522522
});
523523

524-
['EXISTS', 'NOT EXISTS'].forEach((operator) => {
524+
['NOT EXISTS'].forEach((operator) => {
525525
it(`should support ${operator} operator`, () => {
526526
expect(getParsedSql(`SELECT a FROM t WHERE ${operator} (SELECT 1)`))
527527
.to.equal(`SELECT \`a\` FROM \`t\` WHERE ${operator} (SELECT 1)`);
528528
});
529529
});
530530

531+
it(`should support exists operator`, () => {
532+
const operator = 'EXISTS'
533+
expect(getParsedSql(`SELECT a FROM t WHERE ${operator} (SELECT 1)`))
534+
.to.equal(`SELECT \`a\` FROM \`t\` WHERE ${operator}(SELECT 1)`);
535+
});
536+
531537
it('should support row value constructors', () => {
532538
expect(getParsedSql(`SELECT * FROM "user" WHERE (firstname, lastname) = ('John', 'Doe')`))
533539
.to.equal(`SELECT * FROM \`user\` WHERE (\`firstname\`, \`lastname\`) = ('John', 'Doe')`);
@@ -958,12 +964,18 @@ describe('AST', () => {
958964
.to.equal('DELETE `col1` FROM `t` WHERE `col2` IN (1, 3, 5, 7)');
959965
});
960966

961-
['EXISTS', 'NOT EXISTS'].forEach((operator) => {
967+
['NOT EXISTS'].forEach((operator) => {
962968
it(`should support ${operator} operator`, () => {
963969
expect(getParsedSql(`DELETE a FROM t WHERE ${operator} (SELECT 1)`))
964970
.to.equal(`DELETE \`a\` FROM \`t\` WHERE ${operator} (SELECT 1)`);
965971
});
966972
})
973+
974+
it(`should support exists operator`, () => {
975+
const operator = 'EXISTS'
976+
expect(getParsedSql(`DELETE a FROM t WHERE ${operator} (SELECT 1)`))
977+
.to.equal(`DELETE \`a\` FROM \`t\` WHERE ${operator}(SELECT 1)`);
978+
});
967979
});
968980

969981
it('should support JOINs', () => {
@@ -1108,12 +1120,18 @@ describe('AST', () => {
11081120
.to.equal('UPDATE `t` SET \`col1\` = 5 WHERE `col2` IN (1, 3, 5, 7)');
11091121
});
11101122

1111-
['EXISTS', 'NOT EXISTS'].forEach((operator) => {
1123+
['NOT EXISTS'].forEach((operator) => {
11121124
it(`should support ${operator} operator`, () => {
11131125
expect(getParsedSql(`UPDATE a SET col1 = 5 WHERE ${operator} (SELECT 1)`))
11141126
.to.equal(`UPDATE \`a\` SET \`col1\` = 5 WHERE ${operator} (SELECT 1)`);
11151127
});
11161128
})
1129+
1130+
it(`should support exists operator`, () => {
1131+
const operator = 'EXISTS'
1132+
expect(getParsedSql(`UPDATE a SET col1 = 5 WHERE ${operator} (SELECT 1)`))
1133+
.to.equal(`UPDATE \`a\` SET \`col1\` = 5 WHERE ${operator}(SELECT 1)`);
1134+
});
11171135
});
11181136

11191137

0 commit comments

Comments
 (0)