I am trying to write a function to create unique random tokens of variable length. However, I am very puzzled by the plpgsql syntax. I intend to create a function that
- Takes a table and column as input
- Generates a random string of a given length with a given character set
- Checks if row is in column
- If so (and expected to be rare), just generate a new random string.
- Otherwise return a random string
My current attempt is as follows:
CREATE FUNCTION random_token(_table TEXT, _column TEXT, _length INTEGER) RETURNS text AS $$
DECLARE
alphanum CONSTANT text := 'abcdefghijkmnopqrstuvwxyz23456789';
range_head CONSTANT integer := 25;
range_tail CONSTANT integer := 33;
random_string text;
BEGIN
REPEAT
SELECT substring(alphanum from trunc(random() * range_head + 1)::integer for 1) ||
array_to_string(array_agg(substring(alphanum from trunc(random() * range_tail + 1)::integer for 1)), '')
INTO random_string FROM generate_series(1, _length - 1);
UNTIL random_string NOT IN FORMAT('SELECT %I FROM %I WHERE %I = random_string;', _column, _table, _column)
END REPEAT;
RETURN random_string;
END
$$ LANGUAGE plpgsql;
However, this does not work and gives me a not very useful error:
DatabaseError: error 'ERROR: syntax error at or near "REPEAT"
, , . , ?