polardb / polardb/polardbx-sql

floating-precision loss happen after changing AVG(x) to -AVG(-x)

Open
#259 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
1.7k
Forks
337
PR merge metrics
No merged PRs in 30d

Description

after changing AVG(48) to -AVG(-48),floating-precision loss happen

mysql> WITH cte_619 AS (SELECT (SELECT AVG(48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);
+---------------------------+----------------+
| col_1                     | col_2          |
+---------------------------+----------------+
| 4574.00000000000000000000 | 20.00000000000 |
+---------------------------+----------------+
1 row in set (0.03 sec)

mysql> WITH cte_619 AS (SELECT (SELECT -AVG(-48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);
+-------+----------------+
| col_1 | col_2          |
+-------+----------------+
|  4574 | 20.00000000000 |
+-------+----------------+
1 row in set (0.04 sec)

Additionally in mysql:9.5.0,it has been solved

mysql> WITH cte_619 AS (SELECT (SELECT AVG(48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);
+-----------+---------+
| col_1     | col_2   |
+-----------+---------+
| 4856.2353 | 20.0000 |
+-----------+---------+
1 row in set, 1 warning (0.00 sec)

mysql> WITH cte_619 AS (SELECT (SELECT -AVG(-48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);
+-----------+---------+
| col_1     | col_2   |
+-----------+---------+
| 4856.2353 | 20.0000 |
+-----------+---------+
1 row in set, 1 warning (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 9.5.0     |
+-----------+
1 row in set (0.00 sec)

How to repeat

DROP DATABASE IF EXISTS test;
CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE t1 (
    c1 INT NOT NULL AUTO_INCREMENT,
    c2 VARCHAR(255) NOT NULL,
    c3 VARCHAR(255) NULL,
    c4 INT NULL,
    c5 DATE NOT NULL,
    c6 VARCHAR(10) NOT NULL,
    PRIMARY KEY (c1)
);

INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES (4574, 'sample_MLnRpnfpWc7B3vTK1UgPC238vpi0s1RBbTi3w1PPfyiCY1Qe3HkuK1BirM4sFOCpLFIVVZUQXcx9E7nJ8DcoteaIYoCmMAG7ak253nzfIWaLMff8QqQKFiqQNUboBQGfaRwYCYnqkwLYJgdCydQI8rNRPWTPFFUt5xCqVEXgLW1N7qUEH0AoSM4VD1c2wRQCsbvEjBympYHgczmQWCjQtC0HRccDiIPzzJRje', 'sample_3onsNJOHa5682kdaEqRRg3lQcCXjurNd7iSfXX3h', 37, '2025-04-02', 'sample_jMS');


WITH cte_619 AS (SELECT (SELECT AVG(48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);
WITH cte_619 AS (SELECT (SELECT -AVG(-48) AS subq_col FROM t1 AS s890) AS col_1, (SELECT SUM(1) AS subq_col FROM t1 AS s180) AS col_2, AVG(anl57.c1) AS col_3 FROM t1 AS anl57) SELECT riq85.col_3 AS col_1, MINUTE('2023-01-01') AS col_2 FROM cte_619 AS riq85 WHERE NOT riq85.col_2 IS NULL EXCEPT SELECT DISTINCT wao91.col_1 AS col_1, wao91.col_3 AS col_2 FROM cte_619 AS wao91 WHERE (wao91.col_2 <> 91);

version

mysql> select polardb_version();
+---------+--------------+---------------------+
| TYPE    | VERSION      | RELEASE_DATE        |
+---------+--------------+---------------------+
| Product | PolarDB V2.0 | Distributed Edition |
| CN      | 2.4.0.5.4.19 | SNAPSHOT            |
| DN      | 2.4.0.8.4.19 | 20240430            |
| GMS     | 2.4.0.8.4.19 | 20240430            |
+---------+--------------+---------------------+
4 rows in set (0.01 sec)

mysql> select @@version;
+-------------------------+
| @@version               |
+-------------------------+
| 8.0.32-X-Cluster-8.4.19 |
+-------------------------+
1 row in set (0.00 sec)

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 running the provided CREATE TABLE, INSERT, and paired CTE queries on the reported PolarDB-X 8.0.32 environment, then compare their result types and precision. Trace the AVG and unary-negation handling in the SQL execution path. Done means both equivalent expressions return the same precise value, with a regression test covering the reproduction.

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
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.