Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-37704

Mathematically equivalent SUM(x) and AVG(x)*COUNT(x) yield inconsistent results (2 rows vs empty set), indicating logical inconsistency.

    XMLWordPrintable

Details

    • Bug
    • Status: Open (View Workflow)
    • Major
    • Resolution: Unresolved
    • 12.0.2
    • None
    • None
    • None
    • Ubuntu22.04

    Description

      DROP DATABASE IF EXISTS test;
      CREATE DATABASE IF NOT EXISTS test;
      USE test;
      CREATE TABLE users (
          id INT NOT NULL AUTO_INCREMENT,
          name VARCHAR(255) NOT NULL,
          email VARCHAR(255) NULL,
          age INT NULL,
          created_at DATE NOT NULL,
          sex VARCHAR(10) NOT NULL,
          PRIMARY KEY (id)
      );
       
      CREATE TABLE orders (
          id INT NOT NULL AUTO_INCREMENT,
          user_id INT NOT NULL,
          amount DECIMAL(10,2) NOT NULL,
          status VARCHAR(50) NOT NULL,
          order_date DATE NOT NULL,
          PRIMARY KEY (id),
          FOREIGN KEY (user_id) REFERENCES users(id) 
      );
       
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (7491, 'sample_970', '9108479905@qq.com', 95, '2025-07-20', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (8548, 'sample_286', '6264360088@qq.com', 56, '2024-11-26', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (8771, 'sample_851', '1288168102@qq.com', 35, '2025-02-19', 'girl');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (8011, 'sample_187', '6433943147@qq.com', 30, '2024-12-09', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (2606, 'sample_642', '5705695944@qq.com', 78, '2025-01-24', 'girl');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (4085, 'sample_93', '5441361909@qq.com', 4, '2025-08-18', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (5910, 'sample_194', '9932167149@qq.com', 11, '2025-06-27', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (2104, 'sample_815', '9904916978@qq.com', 70, '2025-07-19', 'girl');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (889, 'sample_45', '3945938760@qq.com', 63, '2024-11-16', 'boy');
      INSERT INTO users (id, name, email, age, created_at, sex) VALUES (127, 'sample_814', '5954881147@qq.com', 27, '2025-06-21', 'girl');
       
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (9985, 127, 739, 'finished', '2025-07-20');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (676, 7491, 872, 'finished', '2025-06-19');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (3868, 4085, 685, 'finishing', '2025-02-20');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (7561, 7491, 965, 'finished', '2025-04-03');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (7210, 8548, 285, 'to_finish', '2025-03-20');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (5549, 5910, 794, 'to_finish', '2025-06-15');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (9628, 2104, 861, 'to_finish', '2025-06-30');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (9114, 2104, 610, 'finished', '2024-12-07');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (5308, 5910, 472, 'to_finish', '2025-07-24');
      INSERT INTO orders (id, user_id, amount, status, order_date) VALUES (5086, 4085, 344, 'to_finish', '2024-10-19');
       
       SELECT DISTINCT DENSE_RANK() OVER (ORDER BY 1 = 1) AS dense_rank_col, subq.sex AS sex, COUNT(subq.email) AS count_col, SUM(subq.avg_age) AS sum_col, subq.sex AS sex_1, subq.avg_age AS avg_age FROM (SELECT s864.sex AS sex, AVG(s864.age) AS avg_age, s864.email AS email FROM users AS s864 GROUP BY s864.sex, s864.email) AS subq WHERE NOT subq.avg_age IS NULL GROUP BY subq.avg_age, subq.sex, subq.avg_age, subq.sex, subq.avg_age, subq.avg_age, subq.avg_age HAVING (SUM(subq.avg_age) <= 5.94) ORDER BY subq.avg_age ASC;
       
       SELECT DISTINCT DENSE_RANK() OVER (ORDER BY 1 = 1) AS dense_rank_col, subq.sex AS sex, COUNT(subq.email) AS count_col, (AVG(subq.avg_age) * COUNT(subq.avg_age)) AS sum_col, subq.sex AS sex_1, subq.avg_age AS avg_age FROM (SELECT s864.sex AS sex, AVG(s864.age) AS avg_age, s864.email AS email FROM users AS s864 GROUP BY s864.sex, s864.email) AS subq WHERE NOT subq.avg_age IS NULL GROUP BY subq.avg_age, subq.sex, subq.avg_age, subq.sex, subq.avg_age, subq.avg_age, subq.avg_age HAVING ((AVG(subq.avg_age) * COUNT(subq.avg_age)) <= 5.94) ORDER BY subq.avg_age ASC;
      

      the last two queries' result should be the same,but the second query returns an empty set

      count and sum

      mysql> 
      SELECT DISTINCT DENSE_RANK() OVER (
                                         ORDER BY 1 = 1) AS dense_rank_col,
                      subq.sex AS sex,
                      COUNT(subq.email) AS count_col,
                      SUM(subq.avg_age) AS sum_col,
                      subq.sex AS sex_1,
                      subq.avg_age AS avg_age
      FROM
        (SELECT s864.sex AS sex,
                AVG(s864.age) AS avg_age,
                s864.email AS email
         FROM users AS s864
         GROUP BY s864.sex,
                  s864.email) AS subq
      WHERE NOT subq.avg_age IS NULL
      GROUP BY subq.avg_age,
               subq.sex,
               subq.avg_age,
               subq.sex,
               subq.avg_age,
               subq.avg_age,
               subq.avg_age
      HAVING (SUM(subq.avg_age) <= 5.94)
      ORDER BY subq.avg_age ASC;
      +----------------+-----+-----------+---------+-------+---------+
      | dense_rank_col | sex | count_col | sum_col | sex_1 | avg_age |
      +----------------+-----+-----------+---------+-------+---------+
      |              1 | boy |         1 |  4.0000 | boy   |  4.0000 |
      +----------------+-----+-----------+---------+-------+---------+
      1 row in set (0.01 sec)
      

      avg * count

      mysql> SELECT DISTINCT DENSE_RANK() OVER (
                                         ORDER BY 1 = 1) AS dense_rank_col,
                      subq.sex AS sex,
                      COUNT(subq.email) AS count_col,
                      (AVG(subq.avg_age) * COUNT(subq.avg_age)) AS sum_col,
                      subq.sex AS sex_1,
                      subq.avg_age AS avg_age
      FROM (SELECT s864.sex AS sex,
                    AVG(s864.age) AS avg_age,
                    s864.email AS email
            FROM USER s AS s864
            GROUP BY s864.sex,
                     s864.email) AS subq
      WHERE NOT subq.avg_age IS NULL
      GROUP BY subq.avg_age,
               subq.sex,
               subq.avg_age,
               subq.sex,
               subq.avg_age,
               sub q.avg_age,
               subq.avg_age
      HAVING ((AVG(subq.avg_age) * COUNT(subq.avg_age)) <= 5.94)
      ORDER BY subq.avg_age ASC;
      Empty set (0.00 sec)
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            chen7897 cl hl
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.