Skip to content

Commit 817b4e6

Browse files
fedesassobgrainger
authored andcommitted
Add support for ADO.NET "ReservedWords" collection schema (#558).
1 parent 450b89e commit 817b4e6

File tree

1 file changed

+290
-1
lines changed

1 file changed

+290
-1
lines changed

src/MySqlConnector/Core/SchemaProvider.cs

Lines changed: 290 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public SchemaProvider(MySqlConnection connection)
1616
{
1717
{ "MetaDataCollections", FillMetadataCollections },
1818
{ "DataTypes", FillDataTypes },
19-
{ "Procedures", FillProcedures }
19+
{ "Procedures", FillProcedures },
20+
{ "ReservedWords", FillReservedWords }
2021
};
2122
}
2223

@@ -178,6 +179,294 @@ private void FillProcedures(DataTable dataTable)
178179
close?.Invoke();
179180
}
180181

182+
private void FillReservedWords(DataTable dataTable)
183+
{
184+
dataTable.Columns.Add(new DataColumn("ReservedWord", typeof(string)));
185+
186+
// Note:
187+
// For MySQL 8.0, the INFORMATION_SCHEMA.KEYWORDS table could be used to load the list at runtime,
188+
// unfortunately this bug https://bugs.mysql.com/bug.php?id=90160 makes it impratical to do it
189+
// (the bug is marked as fixed in MySQL 8.0.13, not published yet at the time of writing this note).
190+
//
191+
// Note:
192+
// Once the previously mentioned bug will be fixed, for versions >= 8.0.13 reserved words could be
193+
// loaded at runtime form INFORMATION_SCHEMA.KEYWORDS, and for other versions the hard coded list
194+
// could be used (notice the list could change with the release, adopting the 8.0.12 list is a
195+
// suboptimal one-size-fits-it-all solution.
196+
// To get the current MySQL version at runtime one could query SELECT VERSION(); which returns a
197+
// version followed by a suffix. The problem is that MariaDB 10.0 is only compatible with MySQL 5.6
198+
// (but has a higher version number)
199+
200+
// select word from information_schema.keywords where reserved = 1; on MySQL Server 8.0.12
201+
var reservedWords = new[]
202+
{
203+
"ACCESSIBLE",
204+
"ADD",
205+
"ALL",
206+
"ALTER",
207+
"ANALYZE",
208+
"AND",
209+
"AS",
210+
"ASC",
211+
"ASENSITIVE",
212+
"BEFORE",
213+
"BETWEEN",
214+
"BIGINT",
215+
"BINARY",
216+
"BLOB",
217+
"BOTH",
218+
"BY",
219+
"CALL",
220+
"CASCADE",
221+
"CASE",
222+
"CHANGE",
223+
"CHAR",
224+
"CHARACTER",
225+
"CHECK",
226+
"COLLATE",
227+
"COLUMN",
228+
"CONDITION",
229+
"CONSTRAINT",
230+
"CONTINUE",
231+
"CONVERT",
232+
"CREATE",
233+
"CROSS",
234+
"CUBE",
235+
"CUME_DIST",
236+
"CURRENT_DATE",
237+
"CURRENT_TIME",
238+
"CURRENT_TIMESTAMP",
239+
"CURRENT_USER",
240+
"CURSOR",
241+
"DATABASE",
242+
"DATABASES",
243+
"DAY_HOUR",
244+
"DAY_MICROSECOND",
245+
"DAY_MINUTE",
246+
"DAY_SECOND",
247+
"DEC",
248+
"DECIMAL",
249+
"DECLARE",
250+
"DEFAULT",
251+
"DELAYED",
252+
"DELETE",
253+
"DENSE_RANK",
254+
"DESC",
255+
"DESCRIBE",
256+
"DETERMINISTIC",
257+
"DISTINCT",
258+
"DISTINCTROW",
259+
"DIV",
260+
"DOUBLE",
261+
"DROP",
262+
"DUAL",
263+
"EACH",
264+
"ELSE",
265+
"ELSEIF",
266+
"EMPTY",
267+
"ENCLOSED",
268+
"ESCAPED",
269+
"EXCEPT",
270+
"EXISTS",
271+
"EXIT",
272+
"EXPLAIN",
273+
"FALSE",
274+
"FETCH",
275+
"FIRST_VALUE",
276+
"FLOAT",
277+
"FLOAT4",
278+
"FLOAT8",
279+
"FOR",
280+
"FORCE",
281+
"FOREIGN",
282+
"FROM",
283+
"FULLTEXT",
284+
"FUNCTION",
285+
"GENERATED",
286+
"GET",
287+
"GRANT",
288+
"GROUP",
289+
"GROUPING",
290+
"GROUPS",
291+
"HAVING",
292+
"HIGH_PRIORITY",
293+
"HOUR_MICROSECOND",
294+
"HOUR_MINUTE",
295+
"HOUR_SECOND",
296+
"IF",
297+
"IGNORE",
298+
"IN",
299+
"INDEX",
300+
"INFILE",
301+
"INNER",
302+
"INOUT",
303+
"INSENSITIVE",
304+
"INSERT",
305+
"INT",
306+
"INT1",
307+
"INT2",
308+
"INT3",
309+
"INT4",
310+
"INT8",
311+
"INTEGER",
312+
"INTERVAL",
313+
"INTO",
314+
"IO_AFTER_GTIDS",
315+
"IO_BEFORE_GTIDS",
316+
"IS",
317+
"ITERATE",
318+
"JOIN",
319+
"JSON_TABLE",
320+
"KEY",
321+
"KEYS",
322+
"KILL",
323+
"LAG",
324+
"LAST_VALUE",
325+
"LEAD",
326+
"LEADING",
327+
"LEAVE",
328+
"LEFT",
329+
"LIKE",
330+
"LIMIT",
331+
"LINEAR",
332+
"LINES",
333+
"LOAD",
334+
"LOCALTIME",
335+
"LOCALTIMESTAMP",
336+
"LOCK",
337+
"LONG",
338+
"LONGBLOB",
339+
"LONGTEXT",
340+
"LOOP",
341+
"LOW_PRIORITY",
342+
"MASTER_BIND",
343+
"MASTER_SSL_VERIFY_SERVER_CERT",
344+
"MATCH",
345+
"MAXVALUE",
346+
"MEDIUMBLOB",
347+
"MEDIUMINT",
348+
"MEDIUMTEXT",
349+
"MIDDLEINT",
350+
"MINUTE_MICROSECOND",
351+
"MINUTE_SECOND",
352+
"MOD",
353+
"MODIFIES",
354+
"NATURAL",
355+
"NOT",
356+
"NO_WRITE_TO_BINLOG",
357+
"NTH_VALUE",
358+
"NTILE",
359+
"NULL",
360+
"NUMERIC",
361+
"OF",
362+
"ON",
363+
"OPTIMIZE",
364+
"OPTIMIZER_COSTS",
365+
"OPTION",
366+
"OPTIONALLY",
367+
"OR",
368+
"ORDER",
369+
"OUT",
370+
"OUTER",
371+
"OUTFILE",
372+
"OVER",
373+
"PARTITION",
374+
"PERCENT_RANK",
375+
"PERSIST",
376+
"PERSIST_ONLY",
377+
"PRECISION",
378+
"PRIMARY",
379+
"PROCEDURE",
380+
"PURGE",
381+
"RANGE",
382+
"RANK",
383+
"READ",
384+
"READS",
385+
"READ_WRITE",
386+
"REAL",
387+
"RECURSIVE",
388+
"REFERENCES",
389+
"REGEXP",
390+
"RELEASE",
391+
"RENAME",
392+
"REPEAT",
393+
"REPLACE",
394+
"REQUIRE",
395+
"RESIGNAL",
396+
"RESTRICT",
397+
"RETURN",
398+
"REVOKE",
399+
"RIGHT",
400+
"RLIKE",
401+
"ROW",
402+
"ROWS",
403+
"ROW_NUMBER",
404+
"SCHEMA",
405+
"SCHEMAS",
406+
"SECOND_MICROSECOND",
407+
"SELECT",
408+
"SENSITIVE",
409+
"SEPARATOR",
410+
"SET",
411+
"SHOW",
412+
"SIGNAL",
413+
"SMALLINT",
414+
"SPATIAL",
415+
"SPECIFIC",
416+
"SQL",
417+
"SQLEXCEPTION",
418+
"SQLSTATE",
419+
"SQLWARNING",
420+
"SQL_BIG_RESULT",
421+
"SQL_CALC_FOUND_ROWS",
422+
"SQL_SMALL_RESULT",
423+
"SSL",
424+
"STARTING",
425+
"STORED",
426+
"STRAIGHT_JOIN",
427+
"SYSTEM",
428+
"TABLE",
429+
"TERMINATED",
430+
"THEN",
431+
"TINYBLOB",
432+
"TINYINT",
433+
"TINYTEXT",
434+
"TO",
435+
"TRAILING",
436+
"TRIGGER",
437+
"TRUE",
438+
"UNDO",
439+
"UNION",
440+
"UNIQUE",
441+
"UNLOCK",
442+
"UNSIGNED",
443+
"UPDATE",
444+
"USAGE",
445+
"USE",
446+
"USING",
447+
"UTC_DATE",
448+
"UTC_TIME",
449+
"UTC_TIMESTAMP",
450+
"VALUES",
451+
"VARBINARY",
452+
"VARCHAR",
453+
"VARCHARACTER",
454+
"VARYING",
455+
"VIRTUAL",
456+
"WHEN",
457+
"WHERE",
458+
"WHILE",
459+
"WINDOW",
460+
"WITH",
461+
"WRITE",
462+
"XOR",
463+
"YEAR_MONTH",
464+
"ZEROFILL",
465+
};
466+
foreach (string word in reservedWords)
467+
dataTable.Rows.Add(word);
468+
}
469+
181470
readonly MySqlConnection m_connection;
182471
readonly Dictionary<string, Action<DataTable>> m_schemaCollections;
183472
}

0 commit comments

Comments
 (0)