create or replace function pascal_triangle(n) as table ( with recursive cte as ( SELECT 0 as i, [1]::BIGINT[] as row, UNION ALL SELECT i+1 as i, ([1] || list_transform(row, (x,ix) -> x + (coalesce(row[ix+1], 0)))) as row FROM cte WHERE i < n ) select row as "pascal_triangle" FROM cte order by i ); .print The results for all n<=0 are the same: select * as "pascal_triangle(0)" from pascal_triangle(0); from pascal_triangle(4) _("pascal_triangle(4)");