Open
Description
This is a tracking issue for introducing a new MySQL query parser and an AST-based SQLite driver to significantly improve MySQL compatibility and expand WordPress plugin support.
I think the project can be represented in roughly the following phases:
- Initial version of the MySQL parser — reasonably fast, small, and correct ("make it work").
- Initial version of the SQLite driver — reach parity with the current test suite ("make it work").
- Advanced MySQL support in the SQLite driver — see also test suites below ("make it right").
- Advanced MySQL parser — add version support, verify against MySQL server grammar, fix edge cases ("make it right").
- Advanced tooling — implement a custom parser for ANTLR or ENBF, add custom grammar tooling ("make it right").
- Performance optimizations — explore possibilities to further optimize the new parser ("make it fast").
Here's a list of tasks and issues:
Core
- Exhaustive MySQL Parser
- AST-based SQLite driver Automattic/sqlite-database-integration#1 — match current MySQL compatibility
- SQLite driver — improve compatibility to satisfy multiple extensive test suites (see below)
Test suites
- SQL errors when activating most popular WP plugins: Playground Tester → SQL errors
- WP unit tests: Pass WordPress unit tests wordpress-playground#111 (comment)
- Statically extracted queries from WP plugins: CI: Monitor support for all the SQL queries used by all the WordPress plugins #159
- Supporting all WP CLI commands: Some of the WP-CLI commands don't work wordpress-playground#1618 (comment)
Advanced parser and tooling
- MySQL server version support in the new parser
- A generic grammar parser (ANTLR or [Data Liberation] EBNF processor wordpress-playground#1981)
Supported MySQL constructs
CREATE TABLE
-
CREATE TABLE t (id INT)
-
CREATE TABLE t (id INT NOT NULL)
-
CREATE TABLE t (id INT) DEFAULT 0
-
CREATE TABLE t (...) ENGINE=InnoDB
-
CREATE TABLE t (id INT) COLLATE utf8mb4_czech_ci
-
CREATE TABLE t (id INT PRIMARY KEY)
-
CREATE TABLE t (id INT PRIMARY KEY AUTOINCREMENT)
-
CREATE TABLE t (id INT AUTOINCREMENT, PRIMARY KEY(id))
-
CREATE TABLE t (a INT AUTOINCREMENT, b INT, c INT, PRIMARY KEY(a, b, c))
-
CREATE TABLE t (id INT, UNIQUE(id))
-
CREATE TABLE t LIKE tt
-
CREATE TABLE t [AS] SELECT * FROM tt
-
CREATE TABLE t (...) [AS] SELECT * FROM tt
-
CREATE TABLE t (...) ENGINE=InnoDB [AS] SELECT * FROM tt
-
CREATE TEMPORARY TABLE t (...)
-
CREATE TEMPORARY TABLE t LIKE tt
-
CREATE TABLE IF NOT EXISTS t LIKE tt
-
CREATE TABLE IF NOT EXISTS t (...)
-
CREATE TEMPORARY TABLE IF NOT EXISTS t (...)
-
CREATE TEMPORARY TABLE IF NOT EXISTS t LIKE tt
ALTER TABLE
-
ALTER TABLE t ADD [COLUMN] c INT
-
ALTER TABLE t ADD [COLUMN] c1 INT, c2 TEXT, ...
-
ALTER TABLE t ADD [COLUMN] c INT NOT NULL
-
ALTER TABLE t ADD [COLUMN] c INT DEFAULT 0
-
ALTER TABLE t ADD [COLUMN] c INT NOT NULL DEFAULT 0
-
ALTER TABLE t ADD [COLUMN] c INT [PRIMARY] KEY
-
ALTER TABLE t ADD [COLUMN] c INT UNIQUE [KEY]
-
ALTER TABLE t ADD [COLUMN] c INT AUTO_INCREMENT
-
ALTER TABLE t ADD [COLUMN] c INT COMMENT 'abc'
-
ALTER TABLE t ADD [COLUMN] c TEXT COLLATE 'utf8mb4_0900_ai_ci'
-
ALTER TABLE t ADD [COLUMN] c INT [GENERATED ALWAYS] AS (...)
-
ALTER TABLE t ADD [COLUMN] c INT VIRTUAL
-
ALTER TABLE t ADD [COLUMN] c INT STORED
-
ALTER TABLE t ADD [COLUMN] c INT FIRST
-
ALTER TABLE t ADD [COLUMN] c INT AFTER cc
-
ALTER TABLE t ADD [COLUMN] c INT VISIBLE
-
ALTER TABLE t ADD [COLUMN] c INT INVISIBLE
-
ALTER TABLE t ADD [COLUMN] c INT COLUMN_FORMAT DEFAULT
-
ALTER TABLE t ADD [COLUMN] c INT COLUMN_FORMAT FIXED
-
ALTER TABLE t ADD [COLUMN] c INT COLUMN_FORMAT DYNAMIC
-
ALTER TABLE t ADD [COLUMN] c INT ENGINE_ATTRIBUTE = '...'
-
ALTER TABLE t ADD [COLUMN] c INT SECONDARY_ENGINE_ATTRIBUTE = '...'
-
ALTER TABLE t ADD [COLUMN] c INT STORAGE DISK
-
ALTER TABLE t ADD [COLUMN] c INT STORAGE MEMORY
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id)
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id) MATCH FULL
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id) MATCH PARTIAL
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id) MATCH SIMPLE
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id) ON UPDATE ...
-
ALTER TABLE t ADD [COLUMN] c REFERENCES tt (id) ON DELETE ...
-
ALTER TABLE t ADD [COLUMN] c [CONSTRAINT chck] CHECK (...)
-
ALTER TABLE t ADD [COLUMN] c [CONSTRAINT chck] CHECK (...) ENFORCED
-
ALTER TABLE t ADD [COLUMN] c [CONSTRAINT chck] CHECK (...) NOT ENFORCED
-
ALTER TABLE t DROP [COLUMN] c
-
ALTER TABLE t DROP [COLUMN] c1, c2, ...
-
ALTER TABLE t DROP INDEX idx
-
ALTER TABLE t DROP KEY idx
-
ALTER TABLE t DROP PRIMARY KEY
-
ALTER TABLE t DROP FOREIGN KEY fk
-
ALTER TABLE t DROP CHECK chck
-
ALTER TABLE t DROP CONSTRAINT chck
-
ALTER TABLE t ADD [COLUMN] c1 INT, DROP [COLUMN] c2
Supported MySQL INFORMATION_SCHEMA
tables
INFORMATION_SCHEMA.TABLES
-
TABLE_CATALOG
-
TABLE_SCHEMA
-
TABLE_NAME
-
TABLE_TYPE
-
ENGINE
-
VERSION
-
ROW_FORMAT
-
TABLE_ROWS
-
ĄVG_ROW_LENGTH
-
DATA_LENGTH
-
MAX_DATA_LENGTH
-
INDEX_LENGTH
-
DATA_FREE
-
AUTO_INCREMENT
-
CREATE_TIME
-
UPDATE_TIME
— should be easy to add -
CHECK_TIME
-
TABLE_COLLATION
-
CHECKSUM
-
CREATE_OPTIONS
-
TABLE_COMMENT
Related issues
Here's a list of issues that are likely related. This may need further review and triage:
- Support for
information_schema
tables #146 - Unknown operation: DEFAULT CHARACTER SET #144
- Add
AUTO_INCREMENT
sequence toshow create
statements #140 -
show create
generates invalid default values for columns #125 - SQL syntax error in get_keys() breaks ON DUPLICATE KEY translation #119
- Unknown drop type: INDEX #116
- Support
CREATE TABLE wp_posts_2 LIKE wp_posts
#115 - Support
ALTER TABLE x AUTO_INCREMENT = 100
#114 - Support UNION queries #107
- Support nuances of the SELECT syntax: WITH, UNION, subqueries etc. #106
- Support DELETE LIMIT #100
- Prevent SQLite from inserting NULL values into NOT NULL columns #97
- Date operations not supported #90
- No support for
BINARY
compare e.g.ON BINARY wp_user_meta.meta_value = mollie_customer.mollie_id
#80 - Queries with
INSERT INGORE
are not working? #79 - Support SELECT FROM information_schema #78
- Support SHOW CREATE TABLE #74
- Support GROUP_CONCAT #70
- Wordpress sqlite driver throw constraint exception when updating options #59
- Missing plugin compatibility and overall attention #58
- WooCommerce : Unable to create order. #53 ?
- Date differences when getting
post_date
with SQLite #52 - Support regex_replace #47
- CREATE INDEX and ALTER TABLE not working correctly? #39
- support ALTER TABLE AUTO_INCREMENT #35
- Fatal errors with "show variables like X" queries #34
- Support a = BINARY b #31
- SHOW COLUMNS FROM table needs correctly named columns in result set. #26
- Errors running WooCommerce #19
Metadata
Metadata
Assignees
Labels
No labels