Goal: Fully align omni's MySQL parser keyword set with MySQL 8.0's 252 reserved + 482 non-reserved classification. Eliminate eqFold workarounds for all MySQL keywords. Verification:
go test ./mysql/parser/... -count=1— every scenario is a compile+test assertion Reference sources: MySQL 8.0 keyword list (https://dev.mysql.com/doc/refman/8.0/en/keywords.html)
Status: [ ] pending, [x] passing, [~] partial
Remove redundant eqFold checks for keywords already registered in lexer.go. These words already lex as keyword tokens, so the tokIDENT && eqFold(...) fallback is dead code.
-
processlist— remove eqFold, use kwPROCESSLIST token check only -
keys— remove eqFold, use kwKEYS token check only -
fields— remove eqFold, use kwFIELDS token check only -
source— remove eqFold, use kwSOURCE token check only -
connection— remove eqFold, use kwCONNECTION token check only -
password(in set_show.go) — remove eqFold, use kwPASSWORD token check only - All existing SHOW/SET tests still pass after cleanup
-
each— remove eqFold, use kwEACH token check only -
follows— remove eqFold, use kwFOLLOWS token check only -
precedes— remove eqFold, use kwPRECEDES token check only -
slave(in trigger.go) — remove eqFold, use kwSLAVE token check only - All existing trigger tests still pass after cleanup
-
deterministic— remove eqFold, use kwDETERMINISTIC token check only -
security(in create_function.go) — remove eqFold, use kwSECURITY token check only -
contains— remove eqFold, use kwCONTAINS token check only -
reads— remove eqFold, use kwREADS token check only -
data— remove eqFold, use kwDATA token check only -
modifies— remove eqFold, use kwMODIFIES token check only - All existing CREATE FUNCTION/PROCEDURE tests still pass
-
always— remove eqFold, use kwALWAYS token check only -
security(in create_view.go) — remove eqFold, use kwSECURITY token check only -
VISIBLE— remove eqFold, use kwVISIBLE token check only -
INVISIBLE— remove eqFold, use kwINVISIBLE token check only - All existing CREATE TABLE/VIEW/INDEX tests still pass
-
privileges— remove eqFold, use kwPRIVILEGES token check only -
tables— remove eqFold, use kwTABLES token check only -
slave(in grant.go) — remove eqFold, use kwSLAVE token check only -
current— remove eqFold, use kwCURRENT token check only -
unbounded— remove eqFold, use kwUNBOUNDED token check only - All existing GRANT/REVOKE tests still pass
-
logs— remove eqFold, use kwLOGS token check only -
group(in utility.go resource group) — remove eqFold, use kwGROUP token check only -
user(in replication.go) — remove eqFold, use kwUSER token check only -
password(in replication.go) — remove eqFold, use kwPASSWORD token check only -
slave(in alter_misc.go) — remove eqFold, use kwSLAVE token check only -
security(in alter_misc.go) — remove eqFold, use kwSECURITY token check only -
columns(in load_data.go) — remove eqFold, use kwCOLUMNS token check only -
global/session/local(in name.go) — fix to check keyword token, not eqFold on tokIDENT - All existing utility/replication/misc tests still pass
Register MySQL 8.0 non-reserved keywords in lexer.go and migrate eqFold patterns to keyword token checks.
- Register
geometryas kwGEOMETRY, migrate eqFold in type.go - Register
pointas kwPOINT, migrate eqFold in type.go - Register
linestringas kwLINESTRING, migrate eqFold in type.go - Register
polygonas kwPOLYGON, migrate eqFold in type.go - Register
multipointas kwMULTIPOINT, migrate eqFold in type.go - Register
multilinestringas kwMULTILINESTRING, migrate eqFold in type.go - Register
multipolygonas kwMULTIPOLYGON, migrate eqFold in type.go - Register
geometrycollectionas kwGEOMETRYCOLLECTION, migrate eqFold in type.go - Register
serialas kwSERIAL, migrate eqFold in type.go - Register
nationalas kwNATIONAL, migrate eqFold in type.go - Register
ncharas kwNCHAR, migrate eqFold in type.go - Register
nvarcharas kwNVARCHAR, migrate eqFold in type.go - Register
signedas kwSIGNED, migrate eqFold in type.go, expr.go - Register
precisionas kwPRECISION, migrate eqFold in type.go - Register
longas kwLONG, migrate eqFold in type.go - Register
int1/int2/int3/int4/int8as keywords, migrate eqFold in type.go - Register
middleintas kwMIDDLEINT, migrate eqFold in type.go - Register
float4/float8as keywords, migrate eqFold in type.go - All data type tests still pass after migration
-
CREATE TABLE t (geometry INT)still parses (geometry is non-reserved, valid as column name)
- Register
enforcedas kwENFORCED, migrate eqFold in create_table.go/alter_table.go - Register
lessas kwLESS, migrate eqFold in create_table.go - Register
thanas kwTHAN, migrate eqFold in create_table.go - Register
subpartitionsas kwSUBPARTITIONS, migrate eqFold in create_table.go - Register
leavesas kwLEAVES, migrate eqFold in create_table.go - Register
sridas kwSRID, migrate eqFold in type.go/create_table.go - Register
parseras kwPARSER_KW, migrate eqFold in create_index.go - Register
compressionas kwCOMPRESSION, migrate eqFold in create_table.go - Register
insert_methodas kwINSERT_METHOD, migrate eqFold in create_table.go - All CREATE TABLE/ALTER TABLE/CREATE INDEX tests still pass
- Register
eventsas kwEVENTS, migrate eqFold in set_show.go - Register
indexesas kwINDEXES, migrate eqFold in set_show.go - Register
grantsas kwGRANTS, migrate eqFold in set_show.go - Register
triggersas kwTRIGGERS, migrate eqFold in set_show.go - Register
schemasas kwSCHEMAS, migrate eqFold in set_show.go - Register
partitionsas kwPARTITIONS_KW, migrate eqFold in set_show.go - Register
hostsas kwHOSTS, migrate eqFold in set_show.go - Register
mutexas kwMUTEX, migrate eqFold in set_show.go - Register
profileas kwPROFILE, migrate eqFold in set_show.go - Register
replicasas kwREPLICAS, migrate eqFold in set_show.go - Register
formatas kwFORMAT, migrate eqFold in set_show.go - Register
namesas kwNAMES, migrate eqFold in set_show.go - Register
persist_onlyas kwPERSIST_ONLY, migrate eqFold in set_show.go - All SHOW/SET tests still pass
- Register
accountas kwACCOUNT, migrate eqFold in grant.go - Register
optionas kwOPTION, migrate eqFold in grant.go - Register
proxyas kwPROXY, migrate eqFold in grant.go - Register
routineas kwROUTINE, migrate eqFold in grant.go - Register
expireas kwEXPIRE, migrate eqFold in grant.go - Register
neveras kwNEVER, migrate eqFold in grant.go - Register
dayas kwDAY, migrate eqFold in grant.go - Register
historyas kwHISTORY, migrate eqFold in grant.go - Register
reuseas kwREUSE, migrate eqFold in grant.go - Register
optionalas kwOPTIONAL, migrate eqFold in grant.go - Register
x509as kwX509, migrate eqFold in grant.go - Register
issueras kwISSUER, migrate eqFold in grant.go - Register
subjectas kwSUBJECT, migrate eqFold in grant.go - Register
cipheras kwCIPHER, migrate eqFold in grant.go - Register
factoras kwFACTOR, migrate eqFold in grant.go - Register
initiateas kwINITIATE, migrate eqFold in grant.go - Register
registrationas kwREGISTRATION, migrate eqFold in grant.go - Register
finishas kwFINISH, migrate eqFold in grant.go - Register
unregisteras kwUNREGISTER, migrate eqFold in grant.go - Register
initialas kwINITIAL, migrate eqFold in grant.go - Register
authenticationas kwAUTHENTICATION, migrate eqFold in grant.go - Register
adminas kwADMIN, migrate eqFold in grant.go - Register
clientas kwCLIENT, migrate eqFold in grant.go - All GRANT/CREATE USER/ALTER USER tests still pass
- Register
scheduleas kwSCHEDULE, migrate eqFold in utility.go - Register
completionas kwCOMPLETION, migrate eqFold in utility.go - Register
preserveas kwPRESERVE, migrate eqFold in utility.go - Register
everyas kwEVERY, migrate eqFold in utility.go - Register
startsas kwSTARTS, migrate eqFold in utility.go - Register
endsas kwENDS, migrate eqFold in utility.go - All event/scheduling tests still pass
- Register
actionas kwACTION, migrate eqFold in create_table.go - Register
valueas kwVALUE, migrate eqFold in signal.go, insert.go, expr.go - Register
stackedas kwSTACKED, migrate eqFold in signal.go - Register
unknownas kwUNKNOWN, migrate eqFold in create_function.go - Register
codeas kwCODE, migrate eqFold in set_show.go - Register
xmlas kwXML, migrate eqFold in set_show.go - Register
concurrentas kwCONCURRENT, migrate eqFold in utility.go - Register
workas kwWORK, migrate eqFold in utility.go, transaction.go - Register
xidas kwXID, migrate eqFold in transaction.go - Register
exportas kwEXPORT, migrate eqFold in utility.go - Register
upgradeas kwUPGRADE, migrate eqFold in utility.go - Register
fast/medium/changedas keywords, migrate eqFold in utility.go - Register
waitas kwWAIT, migrate eqFold in utility.go - Register
active/inactiveas keywords, migrate eqFold in utility.go - Register
attributeas kwATTRIBUTE, migrate eqFold in grant.go - Register
secondary_loadas kwSECONDARY_LOAD, migrate eqFold in alter_table.go - Register
secondary_unloadas kwSECONDARY_UNLOAD, migrate eqFold in alter_table.go - All misc tests still pass
- Register
undofileas kwUNDOFILE, migrate eqFold in utility.go - Register
nodegroupas kwNODEGROUP, migrate eqFold in utility.go - Register
extent_sizeas kwEXTENT_SIZE, migrate eqFold in utility.go - Register
initial_sizeas kwINITIAL_SIZE, migrate eqFold in utility.go - Register
max_sizeas kwMAX_SIZE, migrate eqFold in utility.go - Register
file_block_sizeas kwFILE_BLOCK_SIZE, migrate eqFold in utility.go - Register
vcpuas kwVCPU, migrate eqFold in utility.go - Register
thread_priorityas kwTHREAD_PRIORITY, migrate eqFold in utility.go - Register
descriptionas kwDESCRIPTION, migrate eqFold in utility.go - Register
organizationas kwORGANIZATION, migrate eqFold in utility.go - Register
referenceas kwREFERENCE, migrate eqFold in utility.go - Register
definitionas kwDEFINITION, migrate eqFold in utility.go - Register
nameas kwNAME, migrate eqFold in utility.go - Register
systemas kwSYSTEM, migrate eqFold in utility.go - All tablespace/resource group tests still pass
Register missing reserved keywords and expand reservedKeywords map to match MySQL 8.0's 252 reserved words.
These are MySQL 8.0 reserved words not in lexer.go at all. Register and add to reservedKeywords.
- Register
cume_distas kwCUME_DIST (reserved) - Register
dense_rankas kwDENSE_RANK (reserved) - Register
first_valueas kwFIRST_VALUE (reserved) - Register
lagas kwLAG (reserved) - Register
last_valueas kwLAST_VALUE (reserved) - Register
leadas kwLEAD (reserved) - Register
nth_valueas kwNTH_VALUE (reserved) - Register
ntileas kwNTILE (reserved) - Register
percent_rankas kwPERCENT_RANK (reserved) - Register
rankas kwRANK (reserved) - Register
row_numberas kwROW_NUMBER (reserved) - Window function parsing still works (these were parsed as tokIDENT function calls; now they need explicit handling in parsePrimaryExpr or remain callable as keyword-named functions)
-
CREATE TABLE t (rank INT)rejected — rank is reserved, must be backtick-quoted
- Register
day_houras kwDAY_HOUR (reserved) - Register
day_microsecondas kwDAY_MICROSECOND (reserved) - Register
day_minuteas kwDAY_MINUTE (reserved) - Register
day_secondas kwDAY_SECOND (reserved) - Register
hour_microsecondas kwHOUR_MICROSECOND (reserved) - Register
hour_minuteas kwHOUR_MINUTE (reserved) - Register
hour_secondas kwHOUR_SECOND (reserved) - Register
minute_microsecondas kwMINUTE_MICROSECOND (reserved) - Register
minute_secondas kwMINUTE_SECOND (reserved) - Register
second_microsecondas kwSECOND_MICROSECOND (reserved) - Register
year_monthas kwYEAR_MONTH (reserved) - INTERVAL expressions still work with these as keyword tokens (parseIntervalExpr must accept keyword tokens as unit names)
- Register
accessibleas kwACCESSIBLE (reserved) - Register
asensitiveas kwASENSITIVE (reserved) - Register
cubeas kwCUBE (reserved) - Register
dualas kwDUAL (reserved) - Register
groupingas kwGROUPING (reserved) - Register
insensitiveas kwINSENSITIVE (reserved) - Register
io_after_gtidsas kwIO_AFTER_GTIDS (reserved) - Register
io_before_gtidsas kwIO_BEFORE_GTIDS (reserved) - Register
maxvalueas kwMAXVALUE (reserved) — migrate eqFold in create_table.go partition definitions - Register
no_write_to_binlogas kwNO_WRITE_TO_BINLOG (reserved) - Register
ofas kwOF (reserved) — migrate eqFold in select.go, expr.go - Register
optimizer_costsas kwOPTIMIZER_COSTS (reserved) - Register
sensitiveas kwSENSITIVE (reserved) - Register
specificas kwSPECIFIC (reserved) - Register
sqlexceptionas kwSQLEXCEPTION (reserved) - Register
sqlstateas kwSQLSTATE (reserved) - Register
sqlwarningas kwSQLWARNING (reserved) - Register
usageas kwUSAGE (reserved) - Register
utc_dateas kwUTC_DATE (reserved) - Register
utc_timeas kwUTC_TIME (reserved) - Register
utc_timestampas kwUTC_TIMESTAMP (reserved) - Register
varyingas kwVARYING (reserved) - Existing parsing of DUAL, MAXVALUE, GROUPING, SQLSTATE, SQLWARNING, SQLEXCEPTION, UTC functions still works after keyword registration
-
SELECT 1 FROM DUALstill parses (DUAL now a keyword token, FROM clause must accept it)
Add these already-registered keywords to the reservedKeywords map.
- Add kwCROSS to reservedKeywords
- Add kwNATURAL to reservedKeywords
- Add kwFULL to reservedKeywords
- Add kwUSING to reservedKeywords
- Add kwASC to reservedKeywords
- Add kwDESC to reservedKeywords
- Add kwTO to reservedKeywords
- Add kwDIV to reservedKeywords
- Add kwMOD to reservedKeywords
- Add kwXOR to reservedKeywords
- Add kwREGEXP to reservedKeywords
- Add kwRLIKE to reservedKeywords
- Add kwBINARY to reservedKeywords
- Add kwINTERVAL to reservedKeywords
- Add kwMATCH to reservedKeywords
- Add kwESCAPE to reservedKeywords
- All expression/join tests still pass
- Add kwCURRENT_DATE to reservedKeywords
- Add kwCURRENT_TIME to reservedKeywords
- Add kwCURRENT_TIMESTAMP to reservedKeywords
- Add kwCURRENT_USER to reservedKeywords
- Add kwLOCALTIME to reservedKeywords
- Add kwLOCALTIMESTAMP to reservedKeywords
- Add kwDATABASE to reservedKeywords
- Add kwSCHEMA to reservedKeywords
- Add kwDATABASES to reservedKeywords
- All temporal function and schema tests still pass
- Add kwREPLACE to reservedKeywords
- Add kwIGNORE to reservedKeywords
- Add kwLOAD to reservedKeywords
- Add kwUSE to reservedKeywords
- Add kwKILL to reservedKeywords
- Add kwEXPLAIN to reservedKeywords
- Add kwDESCRIBE to reservedKeywords
- Add kwWITH to reservedKeywords
- Add kwREAD to reservedKeywords
- Add kwWRITE to reservedKeywords
- Add kwCALL to reservedKeywords
- Add kwFUNCTION to reservedKeywords
- Add kwPROCEDURE to reservedKeywords
- Add kwTRIGGER to reservedKeywords
- All statement-level tests still pass
- Add kwPARTITION to reservedKeywords
- Add kwRANGE to reservedKeywords
- Add kwROW to reservedKeywords
- Add kwROWS to reservedKeywords
- Add kwOVER to reservedKeywords
- Add kwWINDOW to reservedKeywords
- Add kwSPATIAL to reservedKeywords
- Add kwFULLTEXT to reservedKeywords
- Add kwFORCE to reservedKeywords
- Add kwSTRAIGHT_JOIN to reservedKeywords
- Add kwDISTINCTROW to reservedKeywords
- Add kwHIGH_PRIORITY to reservedKeywords
- Add kwLOW_PRIORITY to reservedKeywords
- Add kwDELAYED to reservedKeywords
- Add kwSQL_CALC_FOUND_ROWS to reservedKeywords
- Add kwOUTFILE to reservedKeywords
- Add kwCONVERT to reservedKeywords
- Add kwCAST to reservedKeywords
- All DDL tests still pass
- Add kwDECLARE to reservedKeywords
- Add kwCONDITION to reservedKeywords
- Add kwCURSOR to reservedKeywords
- Add kwCONTINUE to reservedKeywords
- Add kwEXIT to reservedKeywords
- Add kwFETCH to reservedKeywords
- Add kwDO to reservedKeywords
- Add kwELSEIF to reservedKeywords
- Add kwREPEAT to reservedKeywords
- Add kwUNTIL to reservedKeywords
- Add kwLOOP to reservedKeywords
- Add kwLEAVE to reservedKeywords
- Add kwITERATE to reservedKeywords
- Add kwRETURN to reservedKeywords
- Add kwSIGNAL to reservedKeywords
- Add kwRESIGNAL to reservedKeywords
- Add kwGET to reservedKeywords
- Add kwEACH to reservedKeywords
- Add kwLATERAL to reservedKeywords
- Add kwRECURSIVE to reservedKeywords
- Add kwEMPTY to reservedKeywords
- Add kwSSL to reservedKeywords
- Add kwREQUIRE to reservedKeywords
- All procedural SQL tests still pass
- Add kwLINES to reservedKeywords
- Add kwFIELDS to reservedKeywords
- Add kwTERMINATED to reservedKeywords
- Add kwENCLOSED to reservedKeywords
- Add kwESCAPED to reservedKeywords
- Add kwSTARTING to reservedKeywords
- Add kwOPTIONALLY to reservedKeywords
- Add kwBOTH to reservedKeywords
- Add kwLEADING to reservedKeywords
- Add kwTRAILING to reservedKeywords
- Add kwUNDO to reservedKeywords
- All LOAD DATA and string function tests still pass
After all reserved keywords are registered, audit and fix tests that use reserved words as unquoted identifiers.
- Run full test suite, collect all new failures
- Fix test SQL: quote reserved words used as identifiers with backticks
- Verify oracle corpus tests:
CREATE TABLE select (a INT)now correctly rejected - Verify oracle corpus tests:
CREATE TABLE t (select INT)now correctly rejected - Update oracle_corpus_test.go: change knownMismatch to false for reserved word tests
- Full test suite passes with zero regressions
-
CREATE TABLE t (rank INT)rejected — rank is now reserved -
CREATE TABLE t (`rank` INT)accepted — backtick-quoted reserved word OK -
CREATE TABLE t (status INT)accepted — status is non-reserved, still valid - Completeness audit: reservedKeywords map contains all MySQL 8.0 reserved words that are registered in lexer
- Completeness audit: no eqFold calls remain for strings that are registered keywords (zero dual-check patterns)