-- SRF with a provably-dummy relation explain (verbose, costs off) SELECT unnest(ARRAY[1, 2]) FROM few WHEREfalse; SELECT unnest(ARRAY[1, 2]) FROM few WHEREfalse;
-- SRF shouldn't prevent upper query from recognizing lower as dummy explain (verbose, costs off) SELECT * FROM few f1,
(SELECT unnest(ARRAY[1,2]) FROM few f2 WHEREfalse OFFSET 0) ss; SELECT * FROM few f1,
(SELECT unnest(ARRAY[1,2]) FROM few f2 WHEREfalse OFFSET 0) ss;
-- SRF output order of sorting is maintained, if SRF is not referenced SELECT few.id, generate_series(1,3) g FROM few ORDERBY id DESC;
-- but SRFs can be referenced in sort SELECT few.id, generate_series(1,3) g FROM few ORDERBY id, g DESC; SELECT few.id, generate_series(1,3) g FROM few ORDERBY id, generate_series(1,3) DESC;
-- it's weird to have ORDER BYs that increase the number of results SELECT few.id FROM few ORDERBY id, generate_series(1,3) DESC;
-- SRFs are computed after aggregation SET enable_hashagg TO0; -- stable output order SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1GROUPBY few.dataa; -- unless referenced in GROUP BY clause SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1GROUPBY few.dataa, unnest('{1,1,3}'::int[]); SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1GROUPBY few.dataa, 5;
RESET enable_hashagg;
-- check HAVING works when GROUP BY does [not] reference SRF output SELECT dataa, generate_series(1,1), count(*) FROM few GROUPBY1HAVING count(*) > 1; SELECT dataa, generate_series(1,1), count(*) FROM few GROUPBY1, 2HAVING count(*) > 1;
-- it's weird to have GROUP BYs that increase the number of results SELECT few.dataa, count(*) FROM few WHERE dataa = 'a'GROUPBY few.dataa ORDERBY2; SELECT few.dataa, count(*) FROM few WHERE dataa = 'a'GROUPBY few.dataa, unnest('{1,1,3}'::int[]) ORDERBY2;
-- SRFs are not allowed if they'd need to be conditionally executed SELECT q1, casewhen q1 > 0then generate_series(1,3) else0 end FROM int8_tbl; SELECT q1, coalesce(generate_series(1,3), 0) FROM int8_tbl;
-- SRFs are not allowed in aggregate arguments SELECT min(generate_series(1, 3)) FROM few;
-- ... unless they're within a sub-select SELECT sum((3 = ANY(SELECT generate_series(1,4)))::int);
SELECT sum((3 = ANY(SELECT lag(x) over(orderby x) FROM generate_series(1,4) x))::int);
-- SRFs are not allowed in window function arguments, either SELECT min(generate_series(1, 3)) OVER() FROM few;
-- SRFs are normally computed after window functions SELECT id,lag(id) OVER(), count(*) OVER(), generate_series(1,3) FROM few; -- unless referencing SRFs SELECT SUM(count(*)) OVER(PARTITION BY generate_series(1,3) ORDERBY generate_series(1,3)), generate_series(1,3) g FROM few GROUPBY g;
-- sorting + grouping SELECT few.dataa, count(*), min(id), max(id), generate_series(1,3) FROM few GROUPBY few.dataa ORDERBY5, 1;
-- grouping sets are a bit special, they produce NULLs in columns not actually NULL set enable_hashagg = false; SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab); SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab) ORDERBY dataa; SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab) ORDERBY g; SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab, g); SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab, g) ORDERBY dataa; SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUPBY CUBE(dataa, datab, g) ORDERBY g;
reset enable_hashagg;
-- case with degenerate ORDER BY explain (verbose, costs off) select'foo'as f, generate_series(1,2) as g from few orderby1; select'foo'as f, generate_series(1,2) as g from few orderby1;
-- data modification CREATETABLE fewmore ASSELECT generate_series(1,3) AS data; INSERTINTO fewmore VALUES(generate_series(4,5)); SELECT * FROM fewmore;
-- SRFs are not allowed in UPDATE (they once were, but it was nonsense) UPDATE fewmore SET data = generate_series(4,9);
-- SRFs are not allowed in RETURNING INSERTINTO fewmore VALUES(1) RETURNING generate_series(1,3);
-- nor standalone VALUES (but surely this is a bug?) VALUES(1, generate_series(1,2));
-- We allow tSRFs that are not at top level SELECT int4mul(generate_series(1,2), 10); SELECT generate_series(1,3) ISDISTINCTFROM2;
-- but SRFs in function RTEs must be at top level (annoying restriction) SELECT * FROM int4mul(generate_series(1,2), 10);
-- DISTINCT ON is evaluated before tSRF evaluation if SRF is not -- referenced either in ORDER BY or in the DISTINCT ON list. The ORDER -- BY reference can be implicitly generated, if there's no other ORDER BY.
-- implicit reference (via implicit ORDER) to all columns SELECTDISTINCTON (a) a, b, generate_series(1,3) g FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b);
-- unreferenced in DISTINCT ON or ORDER BY SELECTDISTINCTON (a) a, b, generate_series(1,3) g FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) ORDERBY a, b DESC;
-- referenced in ORDER BY SELECTDISTINCTON (a) a, b, generate_series(1,3) g FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) ORDERBY a, b DESC, g DESC;
-- referenced in ORDER BY and DISTINCT ON SELECTDISTINCTON (a, b, g) a, b, generate_series(1,3) g FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b) ORDERBY a, b DESC, g DESC;
-- only SRF mentioned in DISTINCT ON SELECTDISTINCTON (g) a, b, generate_series(1,3) g FROM (VALUES (3, 2), (3,1), (1,1), (1,4), (5,3), (5,1)) AS t(a, b);
-- LIMIT / OFFSET is evaluated after SRF evaluation SELECT a, generate_series(1,2) FROM (VALUES(1),(2),(3)) r(a) LIMIT2 OFFSET 2; -- SRFs are not allowed in LIMIT. SELECT1LIMIT generate_series(1,3);
-- tSRF in correlated subquery, referencing table outside SELECT (SELECT generate_series(1,3) LIMIT1 OFFSET few.id) FROM few; -- tSRF in correlated subquery, referencing SRF outside SELECT (SELECT generate_series(1,3) LIMIT1 OFFSET g.i) FROM generate_series(0,3) g(i);
-- Operators can return sets too CREATE OPERATOR |@| (PROCEDURE = unnest, RIGHTARG = ANYARRAY); SELECT |@|ARRAY[1,2,3];
-- Some fun cases involving duplicate SRF calls explain (verbose, costs off) select generate_series(1,3) as x, generate_series(1,3) + 1as xp1; select generate_series(1,3) as x, generate_series(1,3) + 1as xp1; explain (verbose, costs off) select generate_series(1,3)+1orderby generate_series(1,3); select generate_series(1,3)+1orderby generate_series(1,3);
-- Check that SRFs of same nesting level run in lockstep explain (verbose, costs off) select generate_series(1,3) as x, generate_series(3,6) + 1as y; select generate_series(1,3) as x, generate_series(3,6) + 1as y;
-- Clean up DROPTABLE few; DROPTABLE fewmore;
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.19Bemerkung:
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.