Posgres SQL Запрос возвращает неожиданный сгенерированный результат? - PullRequest
0 голосов
/ 28 апреля 2020

В настоящее время я автоматически генерирую запросы, которые, как предполагается, передаются в базу данных postgres, так что таблицы и данные в них могут быть сохранены и извлечены, когда это необходимо.

У меня есть один столбец, который я генерирую, называемый entry_name - который в моем случае, кажется, генерируется неправильно по какой-то странной причине?

Итак, в моем запросе - то, что я ожидаю, это то, что entry_name становится тем же именем, что и запись в столбце work_type - но в моем случае это кажется чем-то совершенно другим? - какая-то странная комбинация адреса электронной почты, номера телефона и т. д. c? и я не совсем понял, почему это происходит?

Так что весь запрос здесь

-- Create table with EntityId
CREATE TABLE IF NOT EXISTS public.Personal 
    (personal_id BIGSERIAL PRIMARY KEY);


-- Create table_registration
CREATE TABLE IF NOT EXISTS public.Personal_registration 
(
    personal_id bigint REFERENCES Personal(personal_id),
    row_id BIGSERIAL PRIMARY KEY,
    valid tsrange,
    registration tsrange,
    registration_by varchar(255)
);

-- Autogenerated column
DO
$$
BEGIN
IF NOT EXISTS (SELECT FROM pg_attribute
               WHERE  attrelid = 'public.Personal_registration'::regclass  -- table name here 
               AND    attname = 'work_type'    -- column name here
               AND    NOT attisdropped
              ) THEN

        ALTER TABLE public.Personal_registration 
        ADD COLUMN work_type  text NULL;
ELSE
        ALTER TABLE public.Personal_registration
        ALTER COLUMN  work_type TYPE  text;

END IF;
END
$$;

-- Autogenerated column
DO
$$
BEGIN
IF NOT EXISTS (SELECT FROM pg_attribute
               WHERE  attrelid = 'public.Personal_registration'::regclass  -- table name here 
               AND    attname = 'contact_email_address'    -- column name here
               AND    NOT attisdropped
              ) THEN

        ALTER TABLE public.Personal_registration 
        ADD COLUMN contact_email_address  text NULL;

ELSE
        ALTER TABLE public.Personal_registration
        ALTER COLUMN  contact_email_address TYPE text;

END IF;
END
$$;

-- Autogenerated column
DO
$$
BEGIN
IF NOT EXISTS (SELECT FROM pg_attribute
               WHERE  attrelid = 'public.Personal_registration'::regclass  -- table name here 
               AND    attname = 'contact_mobile_number'    -- column name here
               AND    NOT attisdropped
              ) THEN

        ALTER TABLE public.Personal_registration 
        ADD COLUMN contact_mobile_number  text NULL;
ELSE
        ALTER TABLE public.Personal_registration
        ALTER COLUMN contact_mobile_number TYPE text;
END IF;
END
$$;

-- Autogenerated column
DO
$$
BEGIN
IF NOT EXISTS (SELECT FROM pg_attribute
               WHERE  attrelid = 'public.Personal_registration'::regclass  -- table name here 
               AND    attname = 'contact_phone_number'    -- column name here
               AND    NOT attisdropped
              ) THEN

        ALTER TABLE public.Personal_registration 
        ADD COLUMN contact_phone_number  text NULL;

ELSE
        ALTER TABLE public.Personal_registration
        ALTER COLUMN contact_phone_number TYPE text;
END IF;
END
$$;

-- Create Generated column
ALTER TABLE public.Personal_registration 
DROP COLUMN IF EXISTS entry_name, 
ADD COLUMN entry_name TEXT generated ALWAYS as (CASE WHEN work_type IS NULL THEN NULL 
ELSE work_type END) stored; 


-- Insert an entry
INSERT INTO public.Personal DEFAULT VALUES RETURNING personal_id;


INSERT INTO Personal_registration (personal_id,registration,registration_by,valid,work_type,contact_email_address,contact_mobile_number,contact_phone_number)
                    VALUES (1, 
                            tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'), 
                            'Tester', 
                            tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'),
                            'postman',
                            'dummy@dummy.com',
                            '123456',
                            '654321')
                    RETURNING personal_id,registration,registration_by,valid,work_type,contact_email_address,contact_mobile_number,contact_phone_number, entry_name;

И выполнение этого возвращает это

enter image description here

Это, хотя и не всегда согласованно, - иногда это комбинация почты и номера или т. Д. c?

Я действительно понятия не имею, что происходит не так - и почти потратили 3 дня, чтобы выяснить это?

1 Ответ

1 голос
/ 28 апреля 2020

Вы сталкиваетесь с этой ошибкой:

https://www.postgresql.org/message-id/flat/CAApHDvr7xeMcfGRWQ0rxtagw7CKbjEcjPKfKQAU4KdEcZm6XkQ%40mail.gmail.com#9ac0d8aa3d6ad7e21f4af49a545c8767

Вам вряд ли удастся добиться этого без обновления PG после выпуска с исправление отсутствует; тем временем вы должны изучить это с помощью триггеров, которые существовали в PG всегда и являются гораздо более зрелыми.


Я установил, что это была проблема:

Если я изменю 'postman' на 'postma' или 'postmann', я получу ошибку в бэкэнде при использовании PG 12.2 на Linux. И, если у меня в качестве work_type указан «почтальон», а затем я выбрал имя_трибута из личной_регистрации, результат будет 'dummy@d'. С 'postma' я получаю конкатенацию группы полей из RETURNING, а затем другое значение, усеченное до длины work_type, из последующих выборов:

testdb=# INSERT INTO Personal_registration (personal_id,registration,registration_by,valid,work_type,contact_email_address,contact_mobile_number,contact_phone_number)
VALUES (1, tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'), 'Tester', tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'),
       'postm', 'dummy@dummy.com', '123456', '654321')
RETURNING entry_name;
                              entry_name                              
----------------------------------------------------------------------
 mmy@dummy.com\x0F123456\x0F654321ummy@dummy.com\x0F123456\x0F654321u
(1 row)

INSERT 0 1
testdb=# INSERT INTO Personal_registration (personal_id,registration,registration_by,valid,work_type,contact_email_address,contact_mobile_number,contact_phone_number)
VALUES (1, tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'), 'Tester', tsrange('0001-01-01T00:00:01', '9999-01-01T00:00:02'),
       'postman', 'dummy@dummy.com', '123456', '654321')
RETURNING entry_name;
   entry_name    
-----------------
 dummy@dummy.com
(1 row)

INSERT 0 1
testdb=# select work_type, contact_email_address, entry_name from personal_registration;
 work_type | contact_email_address | entry_name 
-----------+-----------------------+------------
 postm     | dummy@dummy.com       | mmy@d
 postman   | dummy@dummy.com       | dummy@d
(2 rows)

Зависит от длины segfault и усечение значения до длины значения в сгенерированном выражении указывает на ту же проблему, являющуюся причиной root. Точное поведение, вероятно, будет зависеть от платформы, согласно исходному сообщению об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...