Ошибка несовместимости типов (SQLSTATE 42P08)
Есть условная таблица titles:
Column | Type | Collation | Nullable | Default
-------------------+------------------------+-----------+----------+----------------------------------------------
id | integer | | not null | nextval('indexing_results_id_seq'::regclass)
document_id | integer | | |
title | character varying(255) | | not null |
normalized_title | tsvector | | not null |
В неё я добавляю новую строку:
documentId := 1
title := "Some title"
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2, to_tsvector($2))",
&documentId, &title) //передаём title один раз, но используем его в запросе дважды
Но в ответ получаю ошибку:
ERROR: inconsistent types deduced for parameter $2 (SQLSTATE 42P08)
По какой-то причине PostgreSQL не нравится параметр под номером 2 (он дважды используется в запросе).
Если указать тип (хотя бы в одном из мест), то новая строка добавляется нормально и ошибка не выводится:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2::varchar(255), to_tsvector($2))",
&documentId, &title) //указали приведение типа
Также помогает передать одну и ту же переменную title 2 раза:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2, to_tsvector($3))",
&documentId, &title, &title) //вместо двух переменных передаём три
Если не заполнить одно из полей, то тоже всё ок:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, '', to_tsvector($2))",
&documentId, &title) //пропустили поле title
Я никак не могу понять, почему я не могу использовать переменную title в запросе 2 или более раз ($1, $2, $2) без приведения типов? И почему приведение типов помогает избавиться от этой ошибки? В коде я уже всё пересмотрел по несколько раз, но так и не могу выяснить, почему так происходит.
P.S. Если это важно, для работы с PostgreSQL (12 версии) я использую драйвер pgx.
Ответы (1 шт):
Как написал Akina в комментарии к этому вопросу, для разных полей требуются разные значения:
- для поля
title-varying(255) - для функции
to_tsvector()-text
Соответственно, нам нужно указывать приведение типов. Вот итоговое решение:
_, err = connect.Query(currentContext,
"INSERT INTO titles (document_id, title, normalized_title) VALUES ($1, $2::varchar(255), to_tsvector($2::text))",
&documentId, &title)