pingcap / pingcap/docs

Bug Report: Issues with CASE operation

Open
#19,474 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
617
Forks
724
Avg merge
2d 10h
Merged PRs (30d)
223

Description

BugReport: Issues with CASE operation

version

8.3.0

Original sql

select all lineitem.l_shipmode as ref0, lineitem.l_tax as ref1 from lineitem 
where (lineitem.l_shipinstruct) > 100
group by lineitem.l_shipmode, lineitem.l_tax;

return 0 row

Rewritten sql

SELECT l_extendedprice, l_orderkey, l_discount FROM lineitem 
WHERE CASE 
  WHEN l_quantity IS NOT NULL THEN CAST(l_quantity AS decimal(15,2)) 
  WHEN l_suppkey IS NOT NULL THEN CAST(l_suppkey AS unsigned) 
  else 0.21501538554113775  
END <= l_returnflag 
GROUP BY l_orderkey, l_extendedprice, l_discount

return 72 row

Analysis

These two queries are logically equivalent, although they are written differently.

Original Query: The original query filters rows using the condition lineitem.l_shipinstruct > 100 and groups them by lineitem.l_shipmode and lineitem.l_tax. Since 100 is a constant, it is directly used to compare with lineitem.l_shipinstruct.

Rewritten Query: In the rewritten query, a CASE expression is used for conditional checking. It first checks if 100 is NULL, which it isn't, so it directly returns 100. If 100 were NULL (which is not the case here), it would perform further checks and ultimately choose lineitem.l_discount or lineitem.l_commitdate. Therefore, although the rewritten query introduces the CASE statement, the logic is equivalent to the original query, as both compare lineitem.l_shipinstruct with 100.

The two SQL queries are logically equivalent. Unexpectedly, the number of returned rows is different, indicating the presence of a bug.

How to repeat

The exported file for the database is in the attachment. : (https://github.com/LLuopeiqi/newtpcd/blob/main/tidb/tpcd.sql) .

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by loading the attached tidpcd.sql database and running both queries on TiDB 8.3.0, comparing their results and the CASE rewrite behavior. Done means the row-count discrepancy is reproducible, its cause is identified, and the expected result or correction is documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
sql
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.