MySQL Compatibility Matrix
Summary
| Status | Count |
|---|---|
| ✅ Full | 131 |
| ⚠️ Partial | 97 |
| ❌ None | 1 |
| 🟣 MatrixOne-only | 96 |
| ❓ Unknown | 48 |
| Total | 373 |
SQL Statements
| Status | Count |
|---|---|
| ✅ Full | 21 |
| ⚠️ Partial | 58 |
| ❌ None | 1 |
| 🟣 MatrixOne-only | 53 |
| Total | 133 |
SQL Statements
| Statement | MySQL Compat | Notes |
|---|---|---|
| Type of SQL Statements | 🟣 MatrixOne-only | [MO-only] Index page describing MatrixOne's own SQL statement taxonomy; not a MySQL-equivalent concept. |
Data Control Language (DCL)
| Statement | MySQL Compat | Notes |
|---|---|---|
| ALTER ACCOUNT | 🟣 MatrixOne-only | [MO-only] ALTER ACCOUNT |
| ALTER USER | ⚠️ Partial | Only ALTER USER can change passwords; account-limit clauses not honoured Password management options (PASSWORD EXPIRE, PASSWORD HISTORY, PASSWORD REUSE INTERVAL, PASSWORD REQUIRE CURRENT, FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME) not supported Account locking (ACCOUNT LOCK/UNLOCK) not supported REQUIRE clause (TLS/SSL enforcement) not supported COMMENT and ATTRIBUTE modification not supported Multiple users per statement not supported (MySQL 8.0 allows user [, user] ...) |
| CREATE ACCOUNT | 🟣 MatrixOne-only | [MO-only] CREATE ACCOUNT … ADMIN_NAME … |
| CREATE ROLE | ⚠️ Partial | Role exists inside MatrixOne's multi-account model; roles are account-scoped, not server-global as in MySQL. |
| CREATE USER | ⚠️ Partial | IDENTIFIED BY is the only supported password form; IDENTIFIED WITH plugins not supported Connection-IP whitelists and connection-limit clauses not supported COMMENT and ATTRIBUTE clauses not supported 'user'@'host' syntax is accepted and host is stored in mo_catalog.mo_user.user_host but may not restrict connections; users are scoped to the current account, not server-global as in MySQL Password management options (PASSWORD EXPIRE, PASSWORD HISTORY, PASSWORD REUSE INTERVAL, PASSWORD REQUIRE CURRENT) not supported Account locking (ACCOUNT LOCK/UNLOCK) not supported REQUIRE clause (TLS/SSL enforcement) not supported |
| DROP ACCOUNT | 🟣 MatrixOne-only | [MO-only] DROP ACCOUNT |
| DROP ROLE | ⚠️ Partial | Role exists inside MatrixOne's multi-account model; roles are account-scoped, not server-global as in MySQL. |
| DROP USER | ⚠️ Partial | User identifier is a bare username scoped to the current account; MySQL uses 'user'@'host' tuples. |
| GRANT | ⚠️ Partial | Authorization logic differs from MySQL — MatrixOne evaluates via its role/account model User identifier is a bare username scoped to the current account; MySQL uses 'user'@'host' tuples AS user [WITH ROLE ...] clause (MySQL 8.0 privilege restriction) not supported GRANT privilege ... TO only accepts roles; users receive privileges indirectly through role membership (GRANT role TO user) WITH ADMIN OPTION for role grants is not supported [MO-only] GRANT ... ON ACCOUNT * — account-level privileges have no MySQL counterpart[MO-only] GRANT ... ON DATABASE * — MatrixOne-specific database-level grant target[MO-only] GRANT ... ON VIEW db_name.view_name (separate VIEW object_type; MySQL 8.0 only supports TABLE, FUNCTION, PROCEDURE) |
| REVOKE | ⚠️ Partial | Recovery logic differs from MySQL — privileges return to the role/account graph User identifier is a bare username scoped to the current account; MySQL uses 'user'@'host' tuples IGNORE UNKNOWN USER clause (MySQL 8.0.30+) not supported [MO-only] REVOKE ... ON ACCOUNT * — account-level privileges have no MySQL counterpart[MO-only] REVOKE ... ON DATABASE * — MatrixOne-specific database-level revoke target[MO-only] REVOKE ... ON VIEW db_name.view_name (separate VIEW object_type) |
| Role Rewrite Rules (ALTER ROLE ... RULE / SHOW RULES) | 🟣 MatrixOne-only | — |
Data Definition Language (DDL)
| Statement | MySQL Compat | Notes |
|---|---|---|
| ALTER PITR | 🟣 MatrixOne-only | [MO-only] ALTER PITR |
| ALTER PUBLICATION | 🟣 MatrixOne-only | [MO-only] ALTER PUBLICATION |
| ALTER REINDEX | 🟣 MatrixOne-only | [MO-only] ALTER … REINDEX (rebuild vector index) |
| ALTER SEQUENCE | 🟣 MatrixOne-only | [MO-only] ALTER SEQUENCE |
| ALTER STAGE | 🟣 MatrixOne-only | [MO-only] ALTER STAGE |
| ALTER TABLE | ⚠️ Partial | Multiple ALTER TABLE operations can be combined in one statement, with limitation: DROP PRIMARY KEY cannot be combined with RENAME COLUMN, CHANGE COLUMN, or DROP COLUMN (causes server panic); DROP PK + ADD COLUMN and DROP PK + MODIFY COLUMN work correctly Temporary tables cannot be altered ALTER TABLE does not support PARTITION operations |
| ALTER VIEW | ⚠️ Partial | WITH CHECK OPTION is accepted in CREATE VIEW (syntax only, views are read-only) but rejected as a syntax error in ALTER VIEW |
| Branch Protect Snapshots | 🟣 MatrixOne-only | — |
| CREATE CLONE | 🟣 MatrixOne-only | [MO-only] CREATE TABLE … CLONE db.table [TO ACCOUNT …] |
| CREATE CLUSTER TABLE | 🟣 MatrixOne-only | [MO-only] CREATE CLUSTER TABLE |
| CREATE DATABASE | ⚠️ Partial | Only utf8mb4 / utf8mb4_bin are functional; other charsets/collations are syntactically accepted but have no effect ENCRYPTION clause accepted but inert |
| CREATE DYNAMIC TABLE | 🟣 MatrixOne-only | [MO-only] CREATE DYNAMIC TABLE |
| CREATE EXTERNAL TABLE | 🟣 MatrixOne-only | [MO-only] CREATE EXTERNAL TABLE |
| Create Fulltext Index | ⚠️ Partial | MatrixOne full-text index is implemented on TAE storage with CJK/English optimizations; MySQL implements it on InnoDB/MyISAM with different stopword and parser semantics. |
| CREATE FUNCTION...LANGUAGE PYTHON AS | 🟣 MatrixOne-only | [MO-only] CREATE FUNCTION … LANGUAGE PYTHON AS … |
| CREATE FUNCTION...LANGUAGE SQL AS | ⚠️ Partial | Only LANGUAGE SQL and LANGUAGE PYTHON are supported; usage differs significantly from MySQL stored functions CREATE OR REPLACE FUNCTION is supported; MySQL 8.0 does not support OR REPLACE for functions (only IF NOT EXISTS since 8.0.29) |
| CREATE INDEX | ⚠️ Partial | Secondary indexes are supported and participate in query optimization (as of MO 3.0.12, EXPLAIN shows Index Table Scan for secondary index queries). Does not support index hints (USE INDEX, FORCE INDEX, IGNORE INDEX), function-based indexes, or FULLTEXT index via CREATE INDEX syntax (use CREATE FULLTEXT INDEX instead). [MO-only] USING IVFFLAT — vector index for approximate nearest neighbour [MO-only] USING HNSW — vector index for approximate nearest neighbour [MO-only] USING MASTER — composite master index |
| CREATE INDEX USING HNSW | 🟣 MatrixOne-only | [MO-only] CREATE INDEX … USING HNSW |
| CREATE INDEX USING IVFFLAT | 🟣 MatrixOne-only | [MO-only] CREATE INDEX … USING IVFFLAT |
| CREATE PITR | 🟣 MatrixOne-only | [MO-only] CREATE PITR … RANGE N {h|d|mo|y} |
| CREATE PUBLICATION | 🟣 MatrixOne-only | [MO-only] CREATE PUBLICATION |
| CREATE SEQUENCE | 🟣 MatrixOne-only | [MO-only] CREATE SEQUENCE (PostgreSQL-style) |
| CREATE SNAPSHOT | 🟣 MatrixOne-only | [MO-only] CREATE SNAPSHOT FOR {ACCOUNT|DATABASE|TABLE|CLUSTER} |
| CREATE SOURCE | 🟣 MatrixOne-only | [MO-only] CREATE SOURCE (stream/Kafka connector) |
| CREATE STAGE | 🟣 MatrixOne-only | [MO-only] CREATE STAGE (external file-system binding) |
| CREATE TABLE | ⚠️ Partial | ENGINE= clause is syntactically accepted but ignored; MatrixOne uses TAE exclusively Spatial type names (GEOMETRY, POINT, etc.) are syntactically accepted but non-functional; MEDIUMINT is syntactically accepted but treated as INT BOOL is a native boolean type, not an INT alias as in MySQL AUTO_INCREMENT step is always 1; @@auto_increment_increment is syntactically accepted but inert Partitioning accepts syntax but only HASH and KEY participate in partition pruning (RANGE/LIST/RANGE COLUMNS/LIST COLUMNS are syntax-only); subpartitioning causes an internal error; ADD/DROP/TRUNCATE PARTITION not supported CHECK constraints are syntactically accepted but not enforced; MySQL 8.0.16+ enforces them [MO-only] CLUSTER BY (col, …) — pre-sort columns to accelerate queries [MO-only] START TRANSACTION table option — non-standard table option with no MySQL 8.0 equivalent |
| CREATE TABLE ... LIKE | ✅ Full | — |
| CREATE TABLE AS SELECT | ✅ Full | — |
| CREATE TASK (SQL Task) | 🟣 MatrixOne-only | [MO-only] CREATE TASK / ALTER TASK / DROP TASK / EXECUTE TASK / SHOW TASKS (MO-specific scheduled SQL tasks; MySQL uses CREATE EVENT instead) |
| CREATE VIEW | ⚠️ Partial | WITH CHECK OPTION is syntactically accepted but not enforced Views are read-only; MySQL 8.0 supports INSERT/UPDATE/DELETE through views that meet updatability criteria |
| CREATE...FROM...PUBLICATION... | 🟣 MatrixOne-only | [MO-only] CREATE DATABASE … FROM … PUBLICATION … |
| DATA BRANCH CREATE | 🟣 MatrixOne-only | [MO-only] DATA BRANCH CREATE (Git-for-Data) |
| DATA BRANCH DELETE | 🟣 MatrixOne-only | [MO-only] DATA BRANCH DELETE |
| DATA BRANCH DIFF | 🟣 MatrixOne-only | [MO-only] DATA BRANCH DIFF |
| DATA BRANCH MERGE | 🟣 MatrixOne-only | [MO-only] DATA BRANCH MERGE |
| DATA BRANCH PICK | 🟣 MatrixOne-only | [MO-only] DATA BRANCH PICK (cherry-pick specific rows between branch tables, Git-for-Data feature) |
| DROP DATABASE | ✅ Full | — |
| DROP FUNCTION | ⚠️ Partial | Drops MatrixOne-style SQL / Python functions, not MySQL stored procedures/functions Requires argument type list on DROP (e.g. DROP FUNCTION py_add(int, int)); MySQL 8.0 accepts only the function name |
| DROP INDEX | ⚠️ Partial | MO accepts DROP INDEX IF EXISTS syntax (MySQL 8.0 does not), but IF EXISTS does not suppress errors for missing indexes; it returns internal error 20101 instead of a silent skip |
| DROP PITR | 🟣 MatrixOne-only | [MO-only] DROP PITR |
| DROP PUBLICATION | 🟣 MatrixOne-only | [MO-only] DROP PUBLICATION |
| DROP SEQUENCE | 🟣 MatrixOne-only | [MO-only] DROP SEQUENCE |
| DROP SNAPSHOT | 🟣 MatrixOne-only | [MO-only] DROP SNAPSHOT |
| DROP STAGE | 🟣 MatrixOne-only | [MO-only] DROP STAGE |
| DROP TABLE | ✅ Full | — |
| DROP VIEW | ⚠️ Partial | MO does not support dropping multiple views in a single statement; only a single view per DROP VIEW. MySQL 8.0 supports dropping multiple views (e.g., DROP VIEW v1, v2). |
| Rename Table | ⚠️ Partial | MO does not support RENAME TABLE across databases; when given cross-database syntax, MO renames the table within its current database instead of raising an error. MySQL 8.0 supports cross-database RENAME TABLE. |
| RESTORE ... FROM PITR | 🟣 MatrixOne-only | [MO-only] RESTORE … FROM PITR |
| RESTORE ... SNAPSHOT | 🟣 MatrixOne-only | [MO-only] RESTORE … FROM SNAPSHOT |
| TRUNCATE TABLE | ✅ Full | — |
Data Manipulation Language (DML)
| Statement | MySQL Compat | Notes |
|---|---|---|
| CASE | ✅ Full | This page describes the CASE operator (expression), not the stored-program CASE statement. MatrixOne does not support stored programs, so the stored-program CASE STATEMENT is unavailable; the CASE OPERATOR behaves compatibly. |
| CURRENT_ROLE() | ⚠️ Partial | Returns a single active role name; MySQL 8.0 can return multiple comma-separated active roles or 'NONE'. |
| DELETE | ⚠️ Partial | LOW_PRIORITY, QUICK, IGNORE modifiers are syntactically accepted but have no effect PARTITION clause not supported |
| INSERT | ⚠️ Partial | Modifiers LOW_PRIORITY / DELAYED / HIGH_PRIORITY not supported PARTITION clause not supported |
| INSERT ... ON DUPLICATE KEY UPDATE | ⚠️ Partial | ON DUPLICATE KEY UPDATE only triggers on PRIMARY KEY conflicts; UNIQUE index conflicts are detected but result in errors (ERROR 1062 or ERROR 20102) rather than triggering ON DUPLICATE KEY UPDATE |
| INSERT IGNORE | ⚠️ Partial | LOW_PRIORITY / DELAYED / HIGH_PRIORITY modifiers not supported Duplicates are silently ignored; MySQL emits a warning for each skipped row. Does not ignore NULL-into-NOT-NULL, type-conversion, or partition-mismatch errors as MySQL does. PARTITION clause not supported |
| INSERT INTO SELECT | ✅ Full | — |
| LAST_INSERT_ID() | ⚠️ Partial | Multi-row INSERT returns the last inserted auto-increment value; MySQL returns the first inserted value. |
| LAST_QUERY_ID | 🟣 MatrixOne-only | [MO-only] LAST_QUERY_ID() |
| LOAD DATA | ⚠️ Partial | SET clause only accepts columns_name = nullif(expr1, expr2) JSONLines import uses MatrixOne-specific syntax Object-storage import (S3/URL) uses MatrixOne-specific syntax LOW_PRIORITY and CONCURRENT modifiers not supported REPLACE and IGNORE modifiers not supported [MO-only] PARALLEL clause (controls parallel file loading) [MO-only] STRICT clause (controls parallel splitting mode) |
| LOAD DATA INLINE | 🟣 MatrixOne-only | [MO-only] LOAD DATA INLINE (stage-sourced import) |
| REPLACE | ⚠️ Partial | node-sql-parser rejects REPLACE … WHERE (parser bug, not MatrixOne) PARTITION clause not supported LOW_PRIORITY and DELAYED modifiers not supported REPLACE only detects conflicts on PRIMARY KEY; secondary UNIQUE index conflicts throw ERROR 1062 (MySQL 8.0 handles both). Constraints section incorrectly states UNIQUE index can also trigger REPLACE; this is wrong per actual MO behavior. |
| REPLACE | ⚠️ Partial | node-sql-parser rejects REPLACE … WHERE (parser bug, not MatrixOne) PARTITION clause not supported LOW_PRIORITY and DELAYED modifiers not supported REPLACE only detects conflicts on PRIMARY KEY; secondary UNIQUE index conflicts throw ERROR 1062 (MySQL 8.0 handles both). Constraints section incorrectly states UNIQUE index can also trigger REPLACE; this is wrong per actual MO behavior. |
| UPDATE | ⚠️ Partial | LOW_PRIORITY and IGNORE modifiers are syntactically accepted but have no effect PARTITION clause not supported |
| UPSERT | ⚠️ Partial | INSERT IGNORE does not suppress NOT NULL or type-conversion errors (MySQL 8.0 does) INSERT ON DUPLICATE KEY UPDATE only triggers on PRIMARY KEY conflicts; UNIQUE index conflicts are detected but result in errors (ERROR 1062 or ERROR 20102) rather than triggering ON DUPLICATE KEY UPDATE REPLACE does not support REPLACE ... WHERE (parser bug) |
Data Query Language (DQL)
| Statement | MySQL Compat | Notes |
|---|---|---|
| BY RANK WITH OPTION | 🟣 MatrixOne-only | [MO-only] BY RANK WITH OPTION (IVF vector ranking) |
| Combining Queries (UNION, INTERSECT, MINUS) | ⚠️ Partial | MINUS keyword is MO-specific; MySQL 8.0.31+ uses EXCEPT for the same set-difference semantics. MINUS ALL is not yet implemented in MO while MySQL 8.0.31+ supports EXCEPT ALL. INTERSECT was added in MySQL 8.0.31; both MO and MySQL support INTERSECT and INTERSECT ALL with matching semantics. UNION is standard across both, but MO's type coercion in UNION columns is stricter (errors on incompatible types where MySQL silently coerces). [MO-only] MINUS keyword (MO-specific syntax; MySQL 8.0.31+ offers equivalent EXCEPT) |
| Comparisons Using Subqueries | ✅ Full | — |
| CROSS APPLY | 🟣 MatrixOne-only | [MO-only] CROSS APPLY (SQL Server-style, not in MySQL) |
| CROSS JOIN | ✅ Full | — |
| Derived Tables | ⚠️ Partial | LATERAL derived tables are not supported in MO (MySQL 8.0.14+ supports LATERAL for correlated subqueries in FROM clause) |
| FULL JOIN | ❌ None | FULL JOIN with ON clause produces different errors on MO (missing FROM-clause entry) vs MySQL 8.0 (Unknown column in ON clause). FULL JOIN with USING returns INNER JOIN results on both (neither returns unmatched rows). FULL OUTER JOIN produces a syntax error on both. MySQL 8.0 does not natively support either FULL JOIN or FULL OUTER JOIN. |
| INNER JOIN | ✅ Full | — |
| INTERSECT | ⚠️ Partial | INTERSECT was added in MySQL 8.0.31; MO INTERSECT and INTERSECT ALL semantics match MySQL 8.0 (both return identical results for common test cases including duplicate handling) |
| JOIN | ⚠️ Partial | FULL JOIN and FULL OUTER JOIN are not fully supported (FULL JOIN with ON produces errors, FULL JOIN with USING returns INNER JOIN results, FULL OUTER JOIN is a syntax error); MySQL 8.0 also does not support FULL JOIN/OUTER JOIN natively |
| LEFT JOIN | ✅ Full | — |
| MINUS | 🟣 MatrixOne-only | MINUS keyword is MO-specific; MySQL 8.0.31+ uses EXCEPT for the same set-difference semantics (MINUS is not a recognized keyword in MySQL) MINUS ALL is not yet implemented in MO; MySQL 8.0.31+ supports EXCEPT ALL with full duplicate-preserving semantics [MO-only] MINUS keyword (MO's set-difference operator; MySQL 8.0.31+ offers equivalent functionality via EXCEPT) |
| NATURAL JOIN | ✅ Full | — |
| OUTER APPLY | 🟣 MatrixOne-only | [MO-only] OUTER APPLY (SQL Server-style, not in MySQL) |
| OUTER JOIN | ⚠️ Partial | Overview page that includes FULL OUTER JOIN; neither MO nor MySQL 8.0 natively support FULL OUTER JOIN (MO produces syntax error, same as MySQL) |
| RIGHT JOIN | ✅ Full | — |
| SELECT | ⚠️ Partial | SELECT … FOR UPDATE only supports single-table queries SELECT INTO OUTFILE is only partially supported AS OF TIMESTAMP time-travel queries require PITR/snapshot to be enabled on the database; without PITR the syntax produces an error SELECT ... FOR SHARE is not supported FOR UPDATE NOWAIT and SKIP LOCKED modifiers are not supported GROUP BY ... WITH ROLLUP row ordering differs: MO places rollup summary rows at the top of the result set, while MySQL 8.0 places them at the bottom (standard MySQL grouping order) [MO-only] { AS OF TIMESTAMP 'YYYY-MM-DD HH:MM:SS' } — time-travel query against enabled snapshot/PITR [MO-only] ORDER BY ... NULLS { FIRST | LAST } — PostgreSQL-style NULL ordering not available in MySQL |
| Subqueries with ALL | ✅ Full | — |
| Subqueries with ANY or SOME | ✅ Full | — |
| Subqueries with EXISTS or NOT EXISTS | ✅ Full | — |
| Subqueries with IN | ✅ Full | — |
| SUBQUERY | ⚠️ Partial | Multi-column scalar subquery comparisons (e.g., WHERE (a,b) = (SELECT ...)) are not supported; use multi-column IN instead |
| UNION | ⚠️ Partial | UNION type coercion is strict: MO errors on incompatible types in UNION columns (e.g., INT vs VARCHAR), while MySQL 8.0 silently coerces (e.g., varchar to int converts to 0) UNION ALL type coercion is similarly strict compared to MySQL 8.0's lenient coercion |
| WITH (Common Table Expressions) | ⚠️ Partial | Outer joins (LEFT JOIN, RIGHT JOIN, OUTER JOIN) are not allowed in recursive CTE members; MySQL 8.0 permits them except when the recursive CTE is on the right side of a LEFT JOIN (MySQL allows LEFT JOIN with CTE on the left side; MO rejects all outer joins in recursive CTEs regardless of position) |
Other
| Statement | MySQL Compat | Notes |
|---|---|---|
| DEALLOCATE PREPARE | ⚠️ Partial | DEALLOCATE PREPARE on a non-existent statement silently succeeds; MySQL returns ERROR 1243 (Unknown prepared statement handler). |
| DESCRIBE / DESC | ⚠️ Partial | DESCRIBE/DESC output includes an extra Comment column (7 columns total vs MySQL's 6).Type names are displayed in uppercase with display widths (e.g., INT(32), FLOAT(0), TIMESTAMP(0)) instead of MySQL's lowercase without widths (e.g., int, float, timestamp).Column name filter ( DESC tbl_name col_name) is non-functional; all columns are returned.Wild pattern ( DESC tbl_name 'pattern') not supported; produces syntax error.For TIMESTAMP columns with DEFAULT CURRENT_TIMESTAMP, MO does not show DEFAULT_GENERATED in the Extra column as MySQL does. |
| EXECUTE | ✅ Full | — |
| EXPLAIN | ⚠️ Partial | Output format is a single QUERY PLAN column with tree-structured text (PostgreSQL-style); MySQL uses a multi-column tabular format with id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered, Extra JSON output (FORMAT=JSON) not supported; MO returns syntax error FORMAT=TREE and FORMAT=TRADITIONAL not supported; FORMAT=TEXT bare keyword also errors; only bare keyword forms (EXPLAIN, EXPLAIN ANALYZE, EXPLAIN VERBOSE) work EXPLAIN FOR CONNECTION not supported (returns internal error) EXPLAIN (ANALYZE TRUE/FALSE) and EXPLAIN (VERBOSE TRUE/FALSE) parenthesized boolean syntax WORKS in MO 3.0.12, contrary to doc claims; only parenthesized FORMAT syntax is unsupported |
| EXPLAIN Output Format | ⚠️ Partial | Output is a single QUERY PLAN column with tree-structured text; MySQL uses multi-column tabular EXPLAIN format JSON output not supported Node types (Sink, Sink Scan, PreInsert, Fuzzy Filter, etc.) are MO-specific and have no MySQL equivalent |
| EXPLAIN PREPARED | 🟣 MatrixOne-only | [MO-only] EXPLAIN FORCE EXECUTE stmt_name [USING @var] is a MatrixOne extension; MySQL explains prepared statements through EXPLAIN FOR CONNECTION. |
| Get information with EXPLAIN ANALYZE | ⚠️ Partial | Output format mirrors PostgreSQL (QUERY PLAN tree with Analyze sub-lines showing timeConsumed, waitTime, inputRows, outputRows, InputSize, OutputSize, MemorySize); MySQL 8.0 EXPLAIN ANALYZE uses TREE format with cost estimation and actual time in a different structure JSON output not supported MO EXPLAIN ANALYZE produces one output row per plan tree line; MySQL produces a single row with the full plan |
| KILL | ✅ Full | — |
| PREPARE | ⚠️ Partial | MatrixOne cannot PREPARE SET, DO, or other TCL/DCL statements Repreparation on parameter type change may throw a cast error instead of silently converting the value (e.g., passing a string to an integer parameter). |
| SET ROLE | ⚠️ Partial | Accepts a single role name only; MySQL 8.0 also supports NONE, DEFAULT, ALL, ALL EXCEPT role_list, and role lists. [MO-only] SET SECONDARY ROLE {NONE | ALL} — MatrixOne-only primary/secondary role model. |
| SHOW ACCOUNTS | 🟣 MatrixOne-only | [MO-only] SHOW ACCOUNTS |
| SHOW COLLATION | ⚠️ Partial | Only utf8mb4_bin is effective; other collations appear but are inert MO 3.0.12 returns 11 collations (with Default and Pad_attribute columns); older doc examples show only 1 row with 5 columnsOutput columns (Collation, Charset, Id, Default, Compiled, Sortlen, Pad_attribute) differ slightly from MySQL which also includes Pad_attribute |
| SHOW COLUMNS | ⚠️ Partial | MO SHOW COLUMNS (without FULL) already includes the Comment column; MySQL only shows Comment with FULLMO SHOW FULL COLUMNS returns Collation and Privileges columns but Collation is always NULL MO accepts EXTENDED keyword (SHOW EXTENDED COLUMNS) and FIELDS synonym (SHOW FIELDS), both returning same columns as SHOW COLUMNS MO Type column includes display width (e.g. INT(32)) while MySQL shows just int |
| SHOW CREATE DATABASE | ⚠️ Partial | Output omits CHARACTER SET, COLLATE, and ENCRYPTION clauses present in MySQL 8.0 SHOW CREATE DATABASE output |
| SHOW CREATE PUBLICATION | 🟣 MatrixOne-only | [MO-only] SHOW CREATE PUBLICATION |
| SHOW CREATE TABLE | ⚠️ Partial | Output reflects MatrixOne-specific extensions (CLUSTER BY, USING IVFFLAT/HNSW, etc.) MO output omits ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci appended by MySQL |
| SHOW CREATE VIEW | ⚠️ Partial | DEFINER = user clause absent from output; SQL SECURITY {DEFINER|INVOKER} is emitted MO output lacks ALGORITHM=UNDEFINED clause that MySQL always includes MO does not fully qualify column references (MySQL outputs db.table.col AS alias) MO uses unquoted identifiers; MySQL backtick-quotes database, table, and column names The rendered Create View output shows CREATE SQL SECURITY DEFINER VIEW (not CREATE ALGORITHM=UNDEFINED DEFINER=user SQL SECURITY DEFINER VIEW as MySQL does) |
| SHOW DATABASES | ✅ Full | — |
| SHOW FUNCTION STATUS | ⚠️ Partial | Lists MatrixOne SQL/Python functions; MySQL shows stored routines AND built-in sys schema functions (e.g. extract_schema_from_file_name, format_bytes) MO only shows user-defined functions; MySQL shows all functions including built-in ones |
| SHOW GRANTS | ⚠️ Partial | Grant syntax output is completely different: MO uses MO-specific format (GRANT create account ON account, GRANT table all ON table) instead of MySQL standard format (GRANT SELECT, INSERT, UPDATE, DELETE ON .) MO output includes backtick-quoted user@host inside grant statements; MySQL uses quoted user@host format with TO clause USING role_list clause not supported MO does not support SHOW GRANTS FOR CURRENT_USER (or CURRENT_USER()) as a shorthand for the current user |
| SHOW INDEX | ⚠️ Partial | Reflects MatrixOne index model — secondary index rows appear but may not accelerate queries Index_type may be empty (MySQL typically shows BTREE) Index_comment column is present (MySQL 8.0 also has Index_comment; difference is minor) Index_params column is present (MySQL does not have this column) Expression column shows the column name for non-functional key parts; MySQL shows NULL for non-functional key parts MO SHOW INDEX returns 16 columns vs MySQL 15 columns (MO adds Index_params, lacks the extra Collation behavior) |
| SHOW PITR | 🟣 MatrixOne-only | [MO-only] SHOW PITR |
| SHOW PROCESSLIST | ⚠️ Partial | MO returns 19 columns (node_id, conn_id, session_id, account, user, host, db, session_start, command, info, txn_id, statement_id, statement_type, query_type, sql_source_type, query_start, client_host, role, proxy_host) vs MySQL 8 columns (Id, User, Host, db, Command, Time, State, Info) MO column names differ completely: conn_id vs Id, session_start vs Time, no State column, MO adds txn_id/statement_id/statement_type/query_type/sql_source_type/query_start/client_host/role/proxy_host SHOW FULL PROCESSLIST is accepted by MO but returns same columns as SHOW PROCESSLIST (no behavioral difference) |
| SHOW PUBLICATIONS | 🟣 MatrixOne-only | [MO-only] SHOW PUBLICATIONS |
| SHOW ROLES | 🟣 MatrixOne-only | [MO-only] SHOW ROLES |
| SHOW SEQUENCES | 🟣 MatrixOne-only | [MO-only] SHOW SEQUENCES |
| SHOW STAGES | 🟣 MatrixOne-only | [MO-only] SHOW STAGES |
| SHOW SUBSCRIPTIONS | 🟣 MatrixOne-only | [MO-only] SHOW SUBSCRIPTIONS |
| SHOW TABLE STATUS | ⚠️ Partial | Result columns differ from MySQL: MO has 19 cols (adds Role_id, Role_name; omits Version); MySQL has 18 cols (includes Version; no Role_id/Role_name) Engine column always shows Tae instead of InnoDB MO's Auto_increment defaults to 0 (MySQL shows NULL for tables without auto-increment) MO shows views in SHOW TABLE STATUS with Engine=NULL and Comment=VIEW (same as MySQL behavior) |
| SHOW TABLES | ⚠️ Partial | Output column header uses lowercase database name (Tables_in_ MO does not display a parenthesized LIKE pattern in the column header unlike MySQL |
| SHOW VARIABLES | ⚠️ Partial | System variables are mostly syntactic stubs; actual behaviour differs from MySQL GLOBAL and SESSION scope modifiers are syntactically accepted for both SET and SHOW; SHOW GLOBAL vs SHOW SESSION return different values when SESSION has been overridden, same as MySQL MO has a completely different set of variable names (e.g. testbotchvar_nodyn, testbothvar_dyn) alongside MySQL-compatible ones (autocommit, sql_mode) Variable values use lowercase ('on'/'off') while MySQL uses uppercase ('ON'/'OFF') |
| USE | ✅ Full | — |
Functions
| Status | Count |
|---|---|
| ✅ Full | 103 |
| ⚠️ Partial | 26 |
| 🟣 MatrixOne-only | 35 |
| Total | 164 |
Functions
| Function | MySQL Compat | Notes |
|---|---|---|
| Summary table of functions | 🟣 MatrixOne-only | [MO-only] Listing page (includes MatrixOne-only functions). |
Aggregate Functions
| Function | MySQL Compat | Notes |
|---|---|---|
| ANY_VALUE | ✅ Full | — |
| AVG | ⚠️ Partial | AVG() returns DOUBLE for all input types (MySQL returns DECIMAL for exact-value types) |
| BIT_AND | ✅ Full | — |
| BIT_OR | ✅ Full | — |
| BIT_XOR | ✅ Full | — |
| BITMAP function | 🟣 MatrixOne-only | [MO-only] BITMAP aggregates are MatrixOne extensions. |
| COUNT | ✅ Full | — |
| GROUP_CONCAT | ✅ Full | — |
| MAX | ✅ Full | — |
| MEDIAN() | 🟣 MatrixOne-only | [MO-only] MEDIAN aggregate is a MatrixOne-specific aggregate (no native MySQL equivalent). |
| MIN | ✅ Full | — |
| STDDEV_POP | ✅ Full | — |
| SUM | ⚠️ Partial | SUM() returns the input integer type rather than DECIMAL for exact-value arguments (MySQL returns DECIMAL) |
| VAR_POP | ✅ Full | — |
| VARIANCE | ✅ Full | — |
Datetime
| Function | MySQL Compat | Notes |
|---|---|---|
| ADDTIME() | ✅ Full | — |
| CONVERT_TZ() | ✅ Full | — |
| CURDATE() | ⚠️ Partial | curdate()+int returns days since 1970-01-01 rather than coercing both sides to integer and adding like MySQL. |
| CURRENT_TIMESTAMP() | ✅ Full | — |
| CURTIME() | ✅ Full | — |
| DATE_ADD() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| DATE_FORMAT() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| DATE_SUB() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| DATE() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants (yy-mm-dd, yy/mm/dd, yymmdd, etc.). |
| DATEDIFF() | ✅ Full | — |
| DAY() | ✅ Full | — |
| DAYOFYEAR() | ✅ Full | — |
| EXTRACT() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| FROM_UNIXTIME() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| GET_FORMAT() | ✅ Full | — |
| HOUR() | ✅ Full | — |
| MINUTE() | ✅ Full | — |
| MONTH() | ✅ Full | — |
| NOW() | ✅ Full | — |
| SECOND() | ✅ Full | — |
| STR_TO_DATE() | ✅ Full | — |
| SUBTIME() | ✅ Full | — |
| SYSDATE() | ✅ Full | — |
| TIME() | ✅ Full | — |
| TIMEDIFF() | ✅ Full | — |
| TIMESTAMP() | ⚠️ Partial | MatrixOne TIMESTAMP range is '0001-01-01'–'9999-12-31' vs MySQL '1970-01-01'–'2038-01-19' (compat doc: Data Types). Two-argument form TIMESTAMP(expr1, expr2) is not supported; MO only supports single-argument TIMESTAMP(expr) |
| TIMESTAMPADD() | ✅ Full | — |
| TIMESTAMPDIFF() | ✅ Full | — |
| TO_DATE() | 🟣 MatrixOne-only | [MO-only] TO_DATE is a MatrixOne alias for MySQL STR_TO_DATE (compat doc: Date and Time Functions). MySQL's own TO_DATE does not exist. |
| TO_DAYS() | ⚠️ Partial | Two-digit year handling differs: MatrixOne completes '08-10-07' to year 0008; MySQL interprets it as 2008. Dates '0000-00-00' and '0000-01-01' raise an error in MatrixOne rather than being accepted as MySQL does. |
| TO_SECONDS() | ⚠️ Partial | Two-digit year handling differs: MatrixOne completes '08-10-07' to year 0008; MySQL interprets it as 2008. Dates '0000-00-00' and '0000-01-01' raise an error in MatrixOne rather than being accepted as MySQL does. |
| UNIX_TIMESTAMP() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. |
| UTC_TIMESTAMP() | ✅ Full | — |
| WEEK() | ✅ Full | — |
| WEEKDAY() | ✅ Full | — |
| YEAR() | ⚠️ Partial | Date literals accept only 'yyyy-mm-dd' and 'yyyymmdd' formats; MySQL accepts wider variants. [MO-only] TOYEAR() is a MatrixOne alias for YEAR() with no MySQL counterpart. |
| YEARWEEK() | ✅ Full | — |
Json
| Function | MySQL Compat | Notes |
|---|---|---|
| JQ() | 🟣 MatrixOne-only | [MO-only] MatrixOne integration of the jq JSON query language; no MySQL equivalent. |
| JSON Arrow Operators -> and ->> | ✅ Full | — |
| JSON_EXTRACT_FLOAT64() | 🟣 MatrixOne-only | [MO-only] MatrixOne convenience wrapper returning FLOAT64 directly. |
| JSON_EXTRACT_STRING() | 🟣 MatrixOne-only | [MO-only] MatrixOne convenience wrapper returning a string result directly. |
| JSON_EXTRACT() | ✅ Full | — |
| JSON_QUOTE() | ✅ Full | — |
| JSON_ROW() | 🟣 MatrixOne-only | [MO-only] MatrixOne-only; no MySQL equivalent. |
| JSON_SET() | ✅ Full | — |
| JSON_UNQUOTE() | ✅ Full | — |
| TRY_JQ() | 🟣 MatrixOne-only | [MO-only] MatrixOne integration of the jq JSON query language; no MySQL equivalent. |
Mathematical
| Function | MySQL Compat | Notes |
|---|---|---|
| ABS() | ✅ Full | — |
| ACOS() | ✅ Full | — |
| ATAN() | ✅ Full | — |
| CEIL() | ✅ Full | — |
| CEILING() | ✅ Full | — |
| COS() | ✅ Full | — |
| COT() | ✅ Full | — |
| CRC32() | ✅ Full | — |
| EXP() | ✅ Full | — |
| FLOOR() | ⚠️ Partial | MatrixOne supports an optional second decimals argument (FLOOR(number, decimals)) to specify decimal places; MySQL 8.0 only supports the single-argument form FLOOR(X) [MO-only] Two-argument form FLOOR(number, decimals) to specify decimal places |
| LN() | ✅ Full | — |
| LOG() | ✅ Full | — |
| LOG10() | ✅ Full | — |
| LOG2() | ✅ Full | — |
| PI() | ✅ Full | — |
| POWER() | ✅ Full | — |
| RAND() | ⚠️ Partial | RAND(seed) is not supported; calling RAND(N) with an integer argument produces ERROR 20203 |
| ROUND() | ✅ Full | — |
| SIN() | ✅ Full | — |
| SINH() | 🟣 MatrixOne-only | [MO-only] MySQL 8.0 has no hyperbolic trigonometric functions; SINH() is a MatrixOne extension. |
| TAN() | ✅ Full | — |
Other
| Function | MySQL Compat | Notes |
|---|---|---|
| LOAD_FILE() | ⚠️ Partial | LOAD_FILE() takes a DATALINK value (file:// or stage:// URL) rather than MySQL's plain filesystem path argument |
| SAMPLE Sampling Function | 🟣 MatrixOne-only | [MO-only] SAMPLE() is a MatrixOne sampling operator; no MySQL equivalent. |
| SAVE_FILE() | 🟣 MatrixOne-only | [MO-only] SAVE_FILE() writes to a MatrixOne stage; no MySQL equivalent. |
| SERIAL_EXTRACT function | 🟣 MatrixOne-only | [MO-only] SERIAL_EXTRACT() is a MatrixOne internal serial-column extractor. |
| SLEEP() | ✅ Full | — |
| STAGE_LIST() | 🟣 MatrixOne-only | [MO-only] STAGE_LIST() — MO-specific stage management function (currently unimplemented, returns ERROR 20105) |
| UUID() | ✅ Full | — |
String
| Function | MySQL Compat | Notes |
|---|---|---|
| AES_DECRYPT() | ⚠️ Partial | MatrixOne supports only aes-128-ecb and aes-256-cbc block modes; MySQL 8.0 also supports the full set of ECB/CBC/CFB/OFB variants at multiple key sizes. MatrixOne AES_DECRYPT does not accept the optional kdf_name / salt / info KDF arguments present in MySQL 8.0. |
| AES_ENCRYPT() | ⚠️ Partial | MatrixOne supports only aes-128-ecb and aes-256-cbc block modes; MySQL 8.0 also supports the full set of ECB/CBC/CFB/OFB variants at multiple key sizes. MatrixOne AES_ENCRYPT does not accept the optional kdf_name / salt / info KDF arguments present in MySQL 8.0. |
| BIN() | ✅ Full | — |
| BIT_LENGTH() | ✅ Full | — |
| CHAR_LENGTH() | ✅ Full | — |
| CONCAT_WS() | ✅ Full | — |
| CONCAT() | ⚠️ Partial | — |
| ELT() | ✅ Full | — |
| EMPTY() | 🟣 MatrixOne-only | [MO-only] EMPTY() is a MatrixOne helper returning whether a string is empty. |
| ENDSWITH() | 🟣 MatrixOne-only | [MO-only] ENDSWITH() is a MatrixOne helper; MySQL has no direct equivalent. |
| FIELD() | ✅ Full | — |
| FIND_IN_SET() | ✅ Full | — |
| FORMAT() | ✅ Full | — |
| FROM_BASE64() | ⚠️ Partial | FROM_BASE64() may include trailing null bytes in decoded output; MySQL strips them (e.g., FROM_BASE64('YQ==') returns 'a\0\0' instead of 'a') |
| HEX() | ✅ Full | — |
| INSTR() | ✅ Full | — |
| LCASE() | ✅ Full | — |
| LEFT() | ✅ Full | — |
| LENGTH() | ✅ Full | — |
| LOCATE() | ✅ Full | — |
| LOWER() | ✅ Full | — |
| LPAD() | ✅ Full | — |
| LTRIM() | ✅ Full | — |
| MD5() | ✅ Full | — |
| NOT REGEXP | ✅ Full | — |
| OCT(N) | ⚠️ Partial | OCT(N) returns a numeric value rather than MySQL's plain string representation |
| REGEXP_INSTR() | ⚠️ Partial | match_type parameter not yet supported; passing it causes ERROR 20203 |
| REGEXP_LIKE() | ✅ Full | — |
| REGEXP_REPLACE() | ✅ Full | — |
| REGEXP_SUBSTR() | ⚠️ Partial | match_type parameter not yet supported; passing it causes ERROR 20203 |
| Regular Expressions Overview | ✅ Full | — |
| REPEAT() | ✅ Full | — |
| REVERSE() | ✅ Full | — |
| RPAD() | ✅ Full | — |
| RTRIM() | ✅ Full | — |
| SHA1()/SHA() | ✅ Full | — |
| SHA2() | ✅ Full | — |
| SPACE() | ✅ Full | — |
| SPLIT_PART() | 🟣 MatrixOne-only | [MO-only] SPLIT_PART() is inherited from PostgreSQL; no MySQL equivalent. |
| STARTSWITH() | 🟣 MatrixOne-only | [MO-only] STARTSWITH() is a MatrixOne helper; MySQL has no direct equivalent. |
| STRCMP() | ✅ Full | — |
| SUBSTRING_INDEX() | ✅ Full | — |
| SUBSTRING() | ✅ Full | — |
| TO_BASE64() | ✅ Full | — |
| TRIM() | ✅ Full | — |
| UCASE() | ✅ Full | — |
| UNHEX() | ✅ Full | — |
| UPPER() | ✅ Full | — |
System Operations
| Function | MySQL Compat | Notes |
|---|---|---|
| CURRENT_ROLE_NAME() | 🟣 MatrixOne-only | [MO-only] MatrixOne multi-account/role system management function (compat doc: System Management Functions). |
| CURRENT_ROLE() | ⚠️ Partial | Returns a single active role name; MySQL 8.0 can return multiple comma-separated active roles or 'NONE'. |
| CURRENT_USER_NAME() | 🟣 MatrixOne-only | [MO-only] MatrixOne multi-account/role system management function (compat doc: System Management Functions). |
| CURRENT_USER, CURRENT_USER() | ⚠️ Partial | The host part may be returned as 'localhost' or the resolved client host rather than MySQL's explicit 'username@host' format. |
| PURGE_LOG() | 🟣 MatrixOne-only | [MO-only] MatrixOne multi-account/role system management function (compat doc: System Management Functions). |
| VERSION | ✅ Full | — |
Table
| Function | MySQL Compat | Notes |
|---|---|---|
| GENERATE_SERIES() | 🟣 MatrixOne-only | [MO-only] Table-valued function; no direct MySQL equivalent. |
| UNNEST() | 🟣 MatrixOne-only | [MO-only] Table-valued function; no direct MySQL equivalent. |
Vector
| Function | MySQL Compat | Notes |
|---|---|---|
| Arithmetic operators | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| CLUSTER_CENTERS | 🟣 MatrixOne-only | [MO-only] CLUSTER_CENTERS() — MO-specific vector clustering function (currently unimplemented, returns ERROR 20102) |
| COSINE_DISTANCE() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| cosine_similarity() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| inner_product() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| l1_norm() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| L2_DISTANCE() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| l2_norm() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| Mathematical class functions | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| NORMALIZE_L2() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| SUBVECTOR() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
| vector_dims() | 🟣 MatrixOne-only | [MO-only] Vector type and related distance/norm/clustering functions are MatrixOne extensions (compat doc: Data Types — \"MatrixOne supports vector types\"). |
Window Functions
| Function | MySQL Compat | Notes |
|---|---|---|
| CUME_DIST() | ✅ Full | — |
| DENSE_RANK() | ✅ Full | — |
| PERCENT_RANK() | ✅ Full | — |
| RANK() | ✅ Full | — |
| ROW_NUMBER() | ✅ Full | — |
Operators
| Status | Count |
|---|---|
| ✅ Full | 6 |
| ⚠️ Partial | 4 |
| 🟣 MatrixOne-only | 5 |
| ❓ Unknown | 47 |
| Total | 62 |
Operators
| Operator | MySQL Compat | Notes |
|---|---|---|
| INTERVAL | ⚠️ Partial | INTERVAL is internally implemented as a two-argument function rather than as a true SQL keyword; documented syntax INTERVAL(expr,unit) differs from MySQL's INTERVAL expr unit keyword-style notation Malformed dates in DATE_ADD/DATE_SUB raise errors rather than returning NULL (MySQL 8.0 returns NULL) |
operators
| Operator | MySQL Compat | Notes |
|---|---|---|
| <=> | ✅ Full | — |
| addition | ❓ Unknown | — |
| and | ❓ Unknown | — |
| arithmetic-operators-overview | ❓ Unknown | — |
| assign-equal | ❓ Unknown | — |
| assignment-operators-overview | ❓ Unknown | — |
| between | ❓ Unknown | — |
| binary | ❓ Unknown | — |
| bit-functions-and-operators-overview | ❓ Unknown | — |
| bitwise-and | ❓ Unknown | — |
| bitwise-inversion | ❓ Unknown | — |
| bitwise-or | ❓ Unknown | — |
| bitwise-xor | ❓ Unknown | — |
| CASE WHEN | ✅ Full | — |
| CAST | ⚠️ Partial | CAST('non-numeric' AS SIGNED) raises an error instead of returning 0 or NULL (MySQL 8.0 returns 0 with a warning) CAST(datetime_typed_value AS CHAR) may fail in some cases (MySQL 8.0 supports it universally) |
| cast-functions-and-operators-overview | ❓ Unknown | — |
| coalesce | ❓ Unknown | — |
| comparison-functions-and-operators-overview | ❓ Unknown | — |
| CONVERT | ⚠️ Partial | CONVERT('non-numeric', SIGNED) raises an error instead of returning 0 or NULL CONVERT(datetime_typed_value, CHAR) may fail in some cases (MySQL 8.0 supports it universally) |
| DECODE() | 🟣 MatrixOne-only | [MO-only] DECODE() was deprecated in MySQL 5.7 and removed in MySQL 8.0; MatrixOne continues to support it |
| div | ❓ Unknown | — |
| division | ❓ Unknown | — |
| ENCODE() | 🟣 MatrixOne-only | [MO-only] ENCODE() was deprecated in MySQL 5.7 and removed in MySQL 8.0; MatrixOne continues to support it |
| equal | ❓ Unknown | — |
| flow-control-functions-overview | ❓ Unknown | — |
| function_ifnull | ❓ Unknown | — |
| function_interval | ❓ Unknown | — |
| function_isnull | ❓ Unknown | — |
| function_least | ❓ Unknown | — |
| function_nullif | ❓ Unknown | — |
| function_strcmp | ❓ Unknown | — |
| greater-than | ❓ Unknown | — |
| greater-than-or-equal | ❓ Unknown | — |
| IF() | ⚠️ Partial | IF(NULL, expr2, expr3) raises an error instead of returning expr3 (MySQL 8.0 returns expr3) |
| ILIKE | 🟣 MatrixOne-only | [MO-only] ILIKE operator for case-insensitive LIKE matching (PostgreSQL extension) |
| IN | ✅ Full | — |
| is | ❓ Unknown | — |
| IS NULL | ✅ Full | — |
| is-not | ❓ Unknown | — |
| is-not-null | ❓ Unknown | — |
| left-shift | ❓ Unknown | — |
| less-than | ❓ Unknown | — |
| less-than-or-equal | ❓ Unknown | — |
| like | ❓ Unknown | — |
| logical-operators-overview | ❓ Unknown | — |
| minus | ❓ Unknown | — |
| mod | ❓ Unknown | — |
| multiplication | ❓ Unknown | — |
| NOT / ! | ✅ Full | — |
| NOT IN | ✅ Full | — |
| not-between | ❓ Unknown | — |
| not-equal | ❓ Unknown | — |
| not-like | ❓ Unknown | — |
| operator-precedence | ❓ Unknown | — |
| operators | ❓ Unknown | — |
| or | ❓ Unknown | — |
| right-shift | ❓ Unknown | — |
| SERIAL_FULL() | 🟣 MatrixOne-only | [MO-only] SERIAL_FULL() is a MO-specific serialization function variant with NULL preservation, no MySQL 8.0 counterpart |
| SERIAL() | 🟣 MatrixOne-only | [MO-only] SERIAL() is a MO-specific serialization function with no MySQL 8.0 counterpart |
| unary-minus | ❓ Unknown | — |
| xor | ❓ Unknown | — |
Data Types
| Status | Count |
|---|---|
| ✅ Full | 1 |
| ⚠️ Partial | 7 |
| 🟣 MatrixOne-only | 3 |
| ❓ Unknown | 1 |
| Total | 12 |
Data Types
| Data Type | MySQL Compat | Notes |
|---|---|---|
| blob-text-type | ❓ Unknown | — |
| Data Type Conversion | ⚠️ Partial | BOOLEAN → DECIMAL cast is not supported; other common conversions are supported |
| Data Types Overview | ⚠️ Partial | TIMESTAMP range is 0001-01-01 to 9999-12-31 (MySQL: 1970-01-01 to 2038-01-19) DATETIME lower bound is 0001-01-01 (MySQL: 1000-01-01) Non-standard type names FLOAT32/FLOAT64 in addition to MySQL's FLOAT/DOUBLE |
| DATALINK Type | 🟣 MatrixOne-only | [MO-only] DATALINK data type with STAGE integration, file:// and stage:// URL schemes [MO-only] load_file() integration for reading DATALINK values |
| ENUM Type | ⚠️ Partial | — |
| Fixed-Point Types (Exact Value) - DECIMAL | ⚠️ Partial | DECIMAL precision supports up to 65 digits via DECIMAL256 |
| JSON Type | ✅ Full | — |
| SET Type | ⚠️ Partial | — |
| UUID Type | 🟣 MatrixOne-only | [MO-only] UUID as a native column type (MySQL 8.0 has UUID() function only, no UUID column type) [MO-only] DEFAULT uuid() on UUID columns |
| Vector Type | 🟣 MatrixOne-only | [MO-only] vecf32 and vecf64 vector data types for embedding storage and similarity search [MO-only] Binary vector insert via hex encoding [MO-only] Dimension specification syntax in column definition |
Date/Time Data Types
| Data Type | MySQL Compat | Notes |
|---|---|---|
| TIMESTAMP Initialization | ⚠️ Partial | TIMESTAMP range is 0001-9999 (MySQL 8.0: 1970-2038); auto-initialization behavior near range boundaries may differ DATETIME DEFAULT 0 is not supported (MySQL 8.0 supports it) TIMESTAMP ON UPDATE CURRENT_TIMESTAMP without explicit DEFAULT defaults to NULL (MySQL 8.0 defaults to 0) DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP without explicit DEFAULT rejects NULL insert (MySQL 8.0 defaults to 0) |
| YEAR Type | ⚠️ Partial | — |
Language Structure
| Status | Count |
|---|---|
| ⚠️ Partial | 2 |
| Total | 2 |
Language Structure
| Element | MySQL Compat | Notes |
|---|---|---|
| Comments | ⚠️ Partial | Supports // single-line comments (C++ style); MySQL 8.0 does not support // comments Does not support /!.../ conditional/executable comments (MySQL 8.0 does) |
| Keywords | ⚠️ Partial | MatrixOne-specific keywords marked with (M) in the keyword list |