-- -- VARIADIC functions. The variadic tail is delivered to Ruby as a single -- Array argument (matching the SQL-level array), including when the caller -- uses the VARIADIC array form. -- CREATE FUNCTION v_sum(VARIADIC int[]) RETURNS int LANGUAGE plruby AS $$ args[0].sum $$; SELECT v_sum(1, 2, 3); v_sum ------- 6 (1 row) SELECT v_sum(10); v_sum ------- 10 (1 row) SELECT v_sum(VARIADIC ARRAY[4, 5, 6]); v_sum ------- 15 (1 row) -- args.length is 1: the tail is one Array, not N scalars. CREATE FUNCTION v_shape(VARIADIC int[]) RETURNS text LANGUAGE plruby AS $$ "argc=#{args.length} tail=#{args[0].inspect}" $$; SELECT v_shape(7, 8, 9); v_shape ----------------------- argc=1 tail=[7, 8, 9] (1 row) -- Fixed arguments before the variadic tail. CREATE FUNCTION v_join(sep text, VARIADIC parts text[]) RETURNS text LANGUAGE plruby AS $$ args[1].join(args[0]) $$; SELECT v_join('-', 'a', 'b', 'c'); v_join -------- a-b-c (1 row) SELECT v_join(', ', 'solo'); v_join -------- solo (1 row) -- NULL elements in the tail arrive as nil. CREATE FUNCTION v_nils(VARIADIC text[]) RETURNS text LANGUAGE plruby AS $$ args[0].map { |e| e.nil? ? '' : e }.join(',') $$; SELECT v_nils('x', NULL, 'y'); v_nils ----------- x,,y (1 row) -- Named parameters still alias the variadic tail as a local. CREATE FUNCTION v_named(VARIADIC nums int[]) RETURNS int LANGUAGE plruby AS $$ nums.max $$; SELECT v_named(3, 1, 4, 1, 5); v_named --------- 5 (1 row)