alibaba / alibaba/AliSQL

Materializing a shared `UNION` CTE changes a scalar `ORDER BY ... LIMIT` result

Open
#184 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
6k
Forks
902
PR merge metrics
No merged PRs in 30d

Description

# Description

The source query and materialized rewrite contain the same two CTE rows. Their
dates are distinct, so `ORDER BY d LIMIT 1` must select `2025-09-01`.

When the outer query and scalar subquery directly share the `UNION` CTE,
AliSQL instead selects the first branch's `2025-09-02` row. Materializing the
complete CTE result with CTAS before reconstructing the query returns the
correct row.

# Expected result

Both forms should return `2025-09-01 | 29`.

# Actual result

```text
source query: 2025-09-02 | 1
materialized query: 2025-09-01 | 29
```

# How to repeat

```sql
DROP DATABASE IF EXISTS alisql_union_cte_limit_repro;
CREATE DATABASE alisql_union_cte_limit_repro;
USE alisql_union_cte_limit_repro;

CREATE TABLE t (
d DATE,
n INT
);

INSERT INTO t VALUES
('2025-09-02', 1),
('2025-09-01', 29);

-- Source query: incorrectly returns 2025-09-02, 1.
WITH c AS (
SELECT d, n FROM t WHERE n = 1
UNION
SELECT d, n FROM t WHERE n = 29
)
SELECT a.d, a.n
FROM c AS a
WHERE (
SELECT b.d
FROM c AS b
ORDER BY b.d
LIMIT 1
) = a.d;

-- Materialize the complete UNION result.
CREATE TABLE vect_cut_cte AS
SELECT d, n FROM t WHERE n = 1
UNION
SELECT d, n FROM t WHERE n = 29;

SELECT * FROM vect_cut_cte ORDER BY d;

-- Materialized rewrite: correctly returns 2025-09-01, 29.
SELECT a.d, a.n
FROM vect_cut_cte AS a
WHERE (
SELECT b.d
FROM vect_cut_cte AS b
ORDER BY b.d
LIMIT 1
) = a.d;
```

# Version

```text
AliSQL version: 8.0.44-2-alisql-dev
Docker image: songhuaxiong/alisql:8.0.44-2
Test date: 2026-09-02
```

Contributor guide

Open the contributing guide

Research direction

Start by running the supplied SQL reproduction against the AliSQL 8.0.44-2 Docker image and confirm the differing results. Trace the CTE, UNION, scalar subquery, ORDER BY, and LIMIT handling, then add or run a regression test showing that both forms return 2025-09-01 | 29.

Written by the indexing model from the issue text.

Assessment

Tech stack
mysql, sql
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.