\set ECHO none
\pset format unaligned

-- ----------------------------------------------------------------------
-- HAVING that compares an aggregate to a bare GROUP BY column (a per-group
-- VARIABLE, not a literal).  having_OpExpr_to_provenance_cmp wraps such a
-- column exactly like a Const -- provenance_semimod(col, gate_one()) -- since
-- a non-agg_token Var in HAVING is necessarily a grouping key, hence constant
-- within its group.  Before this it bailed with "cannot handle complex HAVING
-- expressions".  Both operand orders (agg OP col / col OP agg) are exercised.
--
-- Results are materialised and stripped of their per-run random provenance
-- token before display, so only the stable probability prints.
-- ----------------------------------------------------------------------

CREATE TABLE hgcol(k int, x int);
-- group k has exactly k rows, so count(*) = k iff all k rows are present.
INSERT INTO hgcol VALUES (1,10),(2,10),(2,20),(3,10),(3,20),(3,30);
SELECT add_provenance('hgcol');
DO $$ BEGIN PERFORM set_prob(provenance(), 0.5) FROM hgcol; END $$;

-- HAVING count(*) = k : k=1 -> 0.5, k=2 -> 0.25 (both rows), k=3 -> 0.125 (all).
CREATE TEMP TABLE r1 AS
  SELECT k, probability_evaluate(provenance()) AS p
  FROM hgcol GROUP BY k HAVING count(*) = k;
SELECT remove_provenance('r1');
SELECT 'count=k' AS shape, k, round(p::numeric, 4) AS p FROM r1 ORDER BY k;
DROP TABLE r1;

-- Same with the grouped column on the LEFT of the comparison.
CREATE TEMP TABLE r2 AS
  SELECT k, probability_evaluate(provenance()) AS p
  FROM hgcol GROUP BY k HAVING k = count(*);
SELECT remove_provenance('r2');
SELECT 'k=count' AS shape, k, round(p::numeric, 4) AS p FROM r2 ORDER BY k;
DROP TABLE r2;

-- A different aggregate compared to the grouped column: max(x) = k is never
-- satisfiable here (x >= 10 > k), so every group has probability 0.
CREATE TEMP TABLE r3 AS
  SELECT k, probability_evaluate(provenance()) AS p
  FROM hgcol GROUP BY k HAVING max(x) = k;
SELECT remove_provenance('r3');
SELECT 'max=k' AS shape, k, round(p::numeric, 4) AS p FROM r3 ORDER BY k;
DROP TABLE r3;

SELECT remove_provenance('hgcol');
DROP TABLE hgcol;
