pgmq-migration-0.1.1.0: database/v1.11.0/04_core_functions.sql
------------------------------------------------------------
-- Core utility functions
------------------------------------------------------------
-- prevents race conditions during queue creation by acquiring a transaction-level advisory lock
-- uses a transaction advisory lock maintain the lock until transaction commit
-- a race condition would still exist if lock was released before commit
CREATE FUNCTION pgmq.acquire_queue_lock(queue_name TEXT)
RETURNS void AS $$
BEGIN
PERFORM pg_advisory_xact_lock(hashtext('pgmq.queue_' || queue_name));
END;
$$ LANGUAGE plpgsql;
-- a helper to format table names and check for invalid characters
CREATE FUNCTION pgmq.format_table_name(queue_name text, prefix text)
RETURNS TEXT AS $$
BEGIN
IF queue_name ~ '\$|;|--|'''
THEN
RAISE EXCEPTION 'queue name contains invalid characters: $, ;, --, or \''';
END IF;
RETURN lower(prefix || '_' || queue_name);
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION pgmq.validate_queue_name(queue_name TEXT)
RETURNS void AS $$
BEGIN
IF length(queue_name) > 47 THEN
-- complete table identifier must be <= 63
-- https://www.postgresql.org/docs/17/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
-- e.g. template_pgmq_q_my_queue is an identifier for my_queue when partitioned
-- template_pgmq_q_ (16) + <a max length queue name> (47) = 63
RAISE EXCEPTION 'queue name is too long, maximum length is 47 characters';
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION pgmq._belongs_to_pgmq(table_name TEXT)
RETURNS BOOLEAN AS $$
DECLARE
sql TEXT;
result BOOLEAN;
BEGIN
SELECT EXISTS (
SELECT 1
FROM pg_depend
WHERE refobjid = (SELECT oid FROM pg_extension WHERE extname = 'pgmq')
AND objid = (
SELECT oid
FROM pg_class
WHERE relname = table_name
)
) INTO result;
RETURN result;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION pgmq._extension_exists(extension_name TEXT)
RETURNS BOOLEAN
LANGUAGE SQL
AS $$
SELECT EXISTS (
SELECT 1
FROM pg_extension
WHERE extname = extension_name
)
$$;