Use of HAVING (Select/Group By) on a output-name of an aggregate function causes SYNTAX ERROR

From: "Carlos Sotto Maior \(UOL\)" <csotto(at)uol(dot)com(dot)br>
To: <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Use of HAVING (Select/Group By) on a output-name of an aggregate function causes SYNTAX ERROR
Date: 2021-01-30 22:41:05
Message-ID: 01ca01d6f759$00c24510$0246cf30$@uol.com.br
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Use of an aggregate function on SELECT/GROUP By is a common need.

Also is common to use a friendly output-name like "cnt" for count(*).

But trying to filter results with HAVING <condition> will give SYNTAX error
if the output-name is used as argument.

Comment: Although column <cnt> does not exists in table it is present in the
Group By result that will be filtered by HAVING clause.

In other words: Postgresql is matching <HAVING> arguments to columns at
table level instead of matching to a group by result level.

Thanks for the attention.

Carlos Sotto Maior

--SELECT VERSION() ==> PostgreSQL 13.1 on x86_64-pc-linux-gnu, compiled by
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit

-- Table: public.z_having

-- DROP TABLE public.z_having;

CREATE TABLE public.z_having

(

id integer NOT NULL,

f1 integer,

f2 integer,

payload character varying COLLATE pg_catalog."default",

active boolean,

CONSTRAINT pk_z_having_id PRIMARY KEY (id)

)

TABLESPACE pg_default;

ALTER TABLE public.z_having OWNER to postgres;

COMMENT ON TABLE public.z_having

IS 'Use of Group By with count agregate with output-name (AS clause) is
OK\nBut If HAVING clause is used to filter on output-name (cnt) you get a
syntax error';

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (1, 10, 10,
'aaaaa', false);

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (2, 10, 20,
'aaaaa', true);

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (3, 10, 30,
'aaaaa', false);

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (4, 10, 10,
'aaaaa', true);

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (5, 10, 20,
'aaaaa', true);

INSERT INTO public.z_having(id, f1, f2, payload, active) VALUES (6, 10, 30,
'aaaaa', true);

-- GROUP BY WORKS OK --

SELECT count(*) as cnt, f1, f2, active

FROM public.z_having

GROUP BY f1, f2, active

ORDER BY cnt DESC

-- Adding HAVING clause on output-name for the count() aggregate function
results in SYNTAXerror

SELECT count(*) as cnt, f1, f2, active

FROM public.z_having

GROUP BY f1, f2, active

HAVING active = True AND cnt > 1

ORDER BY cnt DESC

--ERROR MESSAGE *******

--ERROR: column "cnt" does not exist

--LINE 5: HAVING active = True AND cnt > 1

^

--SQL state: 42703

--Character: 135

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Tom Lane 2021-01-30 22:46:29 Re: Use of HAVING (Select/Group By) on a output-name of an aggregate function causes SYNTAX ERROR
Previous Message Andrey Borodin 2021-01-30 16:06:56 Re: CREATE INDEX CONCURRENTLY does not index prepared xact's data