-- Функция: нет двойных пробелов подряд
CREATE OR REPLACE FUNCTION no_double_space (str text)
    RETURNS boolean
    AS $$
BEGIN
    RETURN str !~ E'\s{2,}';
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

-- Функция: нет пробелов в начале и конце строки
CREATE OR REPLACE FUNCTION no_space_start_end (str text)
    RETURNS boolean
    AS $$
BEGIN
    RETURN str !~ E'^\s'
        AND str !~ E'\s$';
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

-- Функция: нет пробелов вообще
CREATE OR REPLACE FUNCTION no_space (str text)
    RETURNS boolean
    AS $$
BEGIN
    RETURN str !~ E'\s';
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

-- Функция: длина строки в заданных границах
CREATE OR REPLACE FUNCTION str_length_between (str text, min_len int, max_len int)
    RETURNS boolean
    AS $$
BEGIN
    RETURN LENGTH(str) BETWEEN min_len AND max_len;
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

-- Функция: стандартная проверка для слова
CREATE OR REPLACE FUNCTION default_word_check (str text)
    RETURNS boolean
    AS $$
BEGIN
    RETURN str IS NULL
        OR no_space (str)
        AND str_length_between (str, 1, 64);
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

-- Функция: стандартная проверка для строки
CREATE OR REPLACE FUNCTION default_str_check (str text)
    RETURNS boolean
    AS $$
BEGIN
    RETURN str IS NULL
        OR no_double_space (str)
        AND no_space_start_end (str)
        AND str_length_between (str, 1, 128);
END;
$$
LANGUAGE plpgsql
IMMUTABLE;

