Skip to content

MIN and MAX return data from WHERE clause on empty input #8911

Closed

Description

@tv42

Describe the bug

Calling MIN or MAX on an empty input values (or one with all-NULL values) should return NULL.

Quoting https://www.postgresql.org/docs/16/functions-aggregate.html

It should be noted that except for count, these functions return a null value when no rows are selected.

To Reproduce

❯ CREATE TABLE mytable(col0 INTEGER);
0 rows in set. Query took 0.024 seconds.
❯ SELECT * FROM mytable;
0 rows in set. Query took 0.005 seconds.
❯ SELECT MIN(col0) FROM mytable WHERE col0=1;
+-------------------+
| MIN(mytable.col0) |
+-------------------+
| 1                 |
+-------------------+
1 row in set. Query took 0.013 seconds.

❯ SELECT MIN(col0) FROM mytable WHERE col0=2;
+-------------------+
| MIN(mytable.col0) |
+-------------------+
| 2                 |
+-------------------+
1 row in set. Query took 0.012 seconds.

❯ SELECT MIN(col0) FROM mytable WHERE col0=3;
+-------------------+
| MIN(mytable.col0) |
+-------------------+
| 3                 |
+-------------------+
1 row in set. Query took 0.013 seconds.

❯ SELECT MAX(col0) FROM mytable WHERE col0=1;
+-------------------+
| MAX(mytable.col0) |
+-------------------+
| 1                 |
+-------------------+
1 row in set. Query took 0.013 seconds.

❯ SELECT MAX(col0) FROM mytable WHERE col0=2;
+-------------------+
| MAX(mytable.col0) |
+-------------------+
| 2                 |
+-------------------+
1 row in set. Query took 0.005 seconds.

❯ SELECT MAX(col0) FROM mytable WHERE col0=3;
+-------------------+
| MAX(mytable.col0) |
+-------------------+
| 3                 |
+-------------------+
1 row in set. Query took 0.013 seconds.

Expected behavior

NULL returned.

Compare to SQLite:

sqlite> CREATE TABLE mytable(col0 INTEGER);
sqlite> SELECT MIN(col0) FROM mytable WHERE col0=1;
NULL
sqlite> SELECT MIN(col0) FROM mytable WHERE col0=2;
NULL
sqlite> SELECT MIN(col0) FROM mytable WHERE col0=3;
NULL
sqlite> SELECT MAX(col0) FROM mytable WHERE col0=1;
NULL
sqlite> SELECT MAX(col0) FROM mytable WHERE col0=2;
NULL
sqlite> SELECT MAX(col0) FROM mytable WHERE col0=3;
NULL

Compare to Postgres:

postgres=# \pset null 'NULL'
Null display is "NULL".
postgres=# CREATE TABLE mytable(col0 INTEGER);
CREATE TABLE
postgres=# SELECT MIN(col0) FROM mytable WHERE col0=1;
 min
------
 NULL
(1 row)

postgres=# SELECT MIN(col0) FROM mytable WHERE col0=2;
 min
------
 NULL
(1 row)

postgres=# SELECT MIN(col0) FROM mytable WHERE col0=3;
 min
------
 NULL
(1 row)

postgres=# SELECT MAX(col0) FROM mytable WHERE col0=1;
 max
------
 NULL
(1 row)

postgres=# SELECT MAX(col0) FROM mytable WHERE col0=2;
 max
------
 NULL
(1 row)

postgres=# SELECT MAX(col0) FROM mytable WHERE col0=3;
 max
------
 NULL
(1 row)

Additional context

No response

Activity

  1. added
    bugSomething isn't working
    on Jan 19, 2024
  2. alamb commented on Jan 19, 2024

    @alamb
    Contributor

    I agree this is a bug. Thanks for filing @tv42

  3. alamb commented on Jan 21, 2024

    @alamb
    Contributor

    Bam! Open/closed in ~ 24 hours 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions