Ошибка несовместимости типов (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 шт):

Автор решения: Win_D

Как написал 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)
→ Ссылка