matrixorigin / matrixorigin/matrixone

[Feature Request] MySQL 8.0 DML Compatibility - DO, SELECT INTO, VALUES, TABLE

Open
#24,500 0 comments 0 reactions 1 assignee Claimed by @daviszhen View on GitHub
kind/compatibility kind/feature priority/p1
Dominant language
Go
Stars
1.9k
Forks
311
Avg merge
1d 3h
Merged PRs (30d)
768

Description

## Overview
MatrixOne v3.0 lacks support for several Data Manipulation Language (DML) features that provide syntactic convenience in MySQL 8.0.

## Environment
- **MatrixOne Version**: 8.0.30-MatrixOne-v3.0:5e4210029
- **Reference**: https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html

---

## 1. DO Statement

### Current Behavior
```sql
DO SLEEP(0.1);
```

**Error:**
```
ERROR 20105 (HY000): not supported: do SLEEP(0.1)
```

### Expected Behavior (MySQL 8.0)
Execute expressions without returning results.

### Workaround
Use SELECT (though it returns a result set):
```sql
SELECT SLEEP(0.1);
```

---

## 2. SELECT INTO Variable

### Current Behavior
```sql
SELECT id INTO @var FROM t1 LIMIT 1;
```

**Error:**
```
ERROR 1064 (HY000): SQL parser error
```

### Expected Behavior (MySQL 8.0)
Assign query result directly to user variable.

### Workaround
Use SET with subquery:
```sql
SET @var = (SELECT id FROM t1 LIMIT 1);
```

---

## 3. Row Subqueries (Row Constructor Comparison)

### Current Behavior
```sql
SELECT * FROM t1 WHERE (id, name) = (SELECT id, name FROM t2 LIMIT 1);
```

**Error:**
```
ERROR 20203 (HY000): invalid argument operator =, bad value [TUPLE TUPLE]
```

### Expected Behavior (MySQL 8.0)
Compare row values for multi-column matching.

### Workaround
Expand to individual column comparisons:
```sql
SELECT * FROM t1
WHERE id = (SELECT id FROM t2 LIMIT 1)
AND name = (SELECT name FROM t2 LIMIT 1);

-- Or use JOIN
SELECT t1.* FROM t1
JOIN t2 ON t1.id = t2.id AND t1.name = t2.name;
```

---

## 4. VALUES Statement (MySQL 8.0.19+)

### Current Behavior
```sql
VALUES (1, 'a'), (2, 'b');
```

**Error:**
```
ERROR 1064 (HY000): SQL parser error
```

### Expected Behavior (MySQL 8.0)
Return row values as a table (similar to SELECT without FROM).

### Workaround
Use SELECT with UNION ALL:
```sql
SELECT 1, 'a' UNION ALL SELECT 2, 'b';
```

---

## 5. TABLE Statement (MySQL 8.0.19+)

### Current Behavior
```sql
TABLE t1;
```

**Error:**
```
ERROR 1064 (HY000): SQL parser error
```

### Expected Behavior (MySQL 8.0)
Shortcut for `SELECT * FROM t1`.

### Workaround
Use standard SELECT:
```sql
SELECT * FROM t1;
```

---

## Priority Assessment

| Feature | Priority | Impact | Common Usage |
|---------|----------|--------|--------------|
| Row Subqueries | **Medium** | Medium | Multi-column comparison in ORM queries |
| SELECT INTO | **Low** | Medium | Stored procedures (not supported anyway) |
| VALUES | **Low** | Low | Modern SQL syntax sugar |
| TABLE | **Low** | Low | Syntax sugar |
| DO | **Low** | Low | Expression execution |

---

## Recommendation

**Row Subqueries** has medium priority as it's commonly generated by ORM frameworks for multi-column comparisons.

---

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.