create or replace function pgq.seq_getval(i_seq_name text) returns bigint as $$ -- ---------------------------------------------------------------------- -- Function: pgq.seq_getval(1) -- -- Read current last_val from seq, without affecting it. -- -- Parameters: -- i_seq_name - Name of the sequence -- -- Returns: -- last value. -- ---------------------------------------------------------------------- declare res int8; fqname text; pos integer; s text; n text; begin pos := position('.' in i_seq_name); if pos > 0 then s := substring(i_seq_name for pos - 1); n := substring(i_seq_name from pos + 1); else s := 'public'; n := i_seq_name; end if; fqname := quote_ident(s) || '.' || quote_ident(n); execute 'select last_value from ' || fqname into res; return res; end; $$ language plpgsql strict; create or replace function pgq.seq_setval(i_seq_name text, i_new_value int8) returns bigint as $$ -- ---------------------------------------------------------------------- -- Function: pgq.seq_setval(2) -- -- Like setval() but does not allow going back. -- -- Parameters: -- i_seq_name - Name of the sequence -- i_new_value - new value -- -- Returns: -- current last value. -- ---------------------------------------------------------------------- declare res int8; fqname text; begin fqname := pgq.quote_fqname(i_seq_name); res := pgq.seq_getval(i_seq_name); if res < i_new_value then perform setval(fqname, i_new_value); return i_new_value; end if; return res; end; $$ language plpgsql strict;