BUG #15040: "could not open relation" error

Поиск
Список
Период
Сортировка
От PG Bug reporting form
Тема BUG #15040: "could not open relation" error
Дата
Msg-id 151741581876.1235.1543133136433276338@wrigleys.postgresql.org
обсуждение исходный текст
Список pgsql-bugs
The following bug has been logged on the website:

Bug reference:      15040
Logged by:          Alexander Konstantinov
Email address:      alkonstantinov@outlook.com
PostgreSQL version: 10.0
Operating system:   Ubuntu
Description:

The following script represents a function, which calls plperlu-function.
This function populates temp table lucy.f_search_full_idx. In the bottom of
the function you can find "raise notice '%', 'passes here';"
The weird thing is that when I execute the function the notice ("passes
here") is raised and yet I got error "could not open relation with OID
935605" which is totally illogical.

Any help and ideas are highly appreciated

CREATE OR REPLACE FUNCTION fts.f_search_full_idx(_search_txt varchar,
_fti_filters jsonb, _sort_spec jsonb, _dt_from date, _dt_to date, _keys
jsonb, _offset integer, _count integer)
RETURNS TABLE (ord integer, doc_id integer, score decimal, titles jsonb,
excerpt jsonb, org_id integer, count integer, langs jsonb, doctype
varchar,
               convention_count integer, case_count integer, thematics
jsonb, from_dt date, to_dt date, dtad_from date, dtad_to date, dtterm_from
date, dtterm_to date,
               dtif_from date, dtif_to date)
AS $$
-- _sort_spec е JSON масив: с елементи {"field" => fieldname, "reverse" =>
boolean}
-- ако _sort_spec е NULL, подредбата е по релевантност
DECLARE
  _jdt          date;
  _fti_fields   varchar;
  _dates        varchar;
  _range_dates  varchar = NULL;
  _adt_from     date;
  _adt_to       date;
BEGIN
  SELECT INTO _dates string_agg(to_char(rec_date, 'YYYYMMDD'), ' ') FROM
fts.f_get_dates_from_str(' ' || _search_txt || ' ');
  SELECT INTO _search_txt _search_txt || COALESCE(' ' || _dates, '');
  SELECT INTO _fti_fields lucy.f_fti_fields(_fti_filters)::varchar;
  --
  IF _dt_from IS NOT NULL THEN
    SELECT INTO _dt_to COALESCE(_dt_to, now()::date);
    -- SELECT INTO _range_dates fts.f_range_dates(_dt_from, _dt_to);
  END IF;
  --
  CREATE TEMPORARY TABLE _t (
    id          SERIAL NOT NULL PRIMARY KEY,
    doc_id      integer,
    score       decimal,
    excerpt     jsonb,
    org_id      integer,
    cnt         integer,
    langs       varchar,
    thematics   varchar,
    from_dt     varchar,
    to_dt       varchar,
    dt          varchar,
    dtad_from   varchar,
    dtad_to     varchar,
    dtterm_from varchar,
    dtterm_to   varchar,
    dtif_from   varchar,
    dtif_to     varchar,
    typ         varchar);
  --
  -- SELECT INTO _range_dates NULL;
-- raise notice '%, %, %, %, %, NULL, NULL', _search_txt, _fti_fields,
_sort_spec::varchar, _range_dates, _keys::varchar;
  INSERT INTO _t (doc_id, score, excerpt, org_id, cnt, langs, thematics,
from_dt, to_dt, dtad_from, dtad_to, dtterm_from, dtterm_to, dtif_from,
dtif_to, dt, typ)
  SELECT f.*, (d.data->'dt')::varchar, t.typ
  FROM lucy.f_search_full_idx(_search_txt, _fti_fields, _sort_spec::varchar,
_range_dates, _keys::varchar, NULL/*_offset*/, NULL/*_count*/) f JOIN
rdb.docs d ON f.doc_id = d.id

                                                                 JOIN
rdb.doc_types t ON d.typ = t.id;
  --
  IF _keys ? 'adoption_range' THEN
    ALTER TABLE _t ADD COLUMN adoption_date date;
    SELECT INTO _adt_from, _adt_to (_keys->'adoption_range'->>'from')::date,
(_keys->'adoption_range'->>'to')::date;
    WITH upd AS (
      SELECT tmp.id, tr.adoption_date
      FROM _t tmp JOIN rdb.docs d ON tmp.id = d.id
                  JOIN rdb.doc_types t ON d.typ = t.id AND t.typ =
'convention'
                  JOIN treaty tr ON d.org_id = tr.id
    )
    UPDATE _t t SET adoption_date = upd.adoption_date
    FROM upd
    WHERE t.id = upd.id;
    --
    DELETE FROM _t WHERE adoption_date < _adt_from OR adoption_date >
_adt_to;
  END IF;
  --
  IF _keys ? 'inforce_range' THEN
    ALTER TABLE _t ADD COLUMN inforce_date date;
    SELECT INTO _adt_from, _adt_to (_keys->'inforce_range'->>'from')::date,
(_keys->'inforce_range'->>'to')::date;
    WITH upd AS (
      SELECT tmp.id, tr.date_entry_into_force
      FROM _t tmp JOIN rdb.docs d ON tmp.id = d.id
                  JOIN rdb.doc_types t ON d.typ = t.id AND t.typ =
'convention'
                  JOIN treaty tr ON d.org_id = tr.id
    )
    UPDATE _t t SET inforce_date = upd.date_entry_into_force
    FROM upd
    WHERE t.id = upd.id;
    --
    DELETE FROM _t WHERE inforce_date < _adt_from OR inforce_date >
_adt_to;
  END IF;
  --
  IF _keys ? 'termination_range' THEN
    ALTER TABLE _t ADD COLUMN date_termination date;
    SELECT INTO _adt_from, _adt_to
(_keys->'termination_range'->>'from')::date,
(_keys->'termination_range'->>'to')::date;
    WITH upd AS (
      SELECT tmp.id, tr.date_termination
      FROM _t tmp JOIN rdb.docs d ON tmp.id = d.id
                  JOIN rdb.doc_types t ON d.typ = t.id AND t.typ =
'convention'
                  JOIN treaty tr ON d.org_id = tr.id
    )
    UPDATE _t t SET date_termination = upd.date_termination
    FROM upd
    WHERE t.id = upd.id;
    --
    DELETE FROM _t WHERE date_termination < _adt_from OR date_termination >
_adt_to;
  END IF;
  --
  UPDATE _t SET dt = NULL WHERE dt !~ '\d';
  --
  SELECT INTO _dt_from COALESCE(_dt_from, '1800-01-01'::date);
  SELECT INTO _dt_to COALESCE(_dt_to, '2800-01-01'::date);
  DELETE FROM _t WHERE dt::date < _dt_from OR dt::date > _dt_to;
  SELECT INTO count cnt FROM _t LIMIT 1;
  SELECT INTO count COALESCE(count, 0);
  --
  SELECT INTO convention_count COUNT(*) FROM _t WHERE typ = 'convention';
  SELECT INTO case_count COUNT(*) - convention_count FROM _t;
-- raise notice '_offset=%, _count=%', _offset, _count;
  --
  FOR ord, doc_id, score, _jdt, titles, excerpt, org_id, langs, thematics,
doctype, from_dt, to_dt, dtad_from, dtad_to, dtterm_from, dtterm_to,
dtif_from, dtif_to IN
    SELECT t.id, t.doc_id, t.score, t.dt::date, jsonb_agg(d.title),
t.excerpt, t.org_id, t.langs::jsonb, t.thematics::jsonb, d.typ,
t.from_dt::date, t.to_dt::date,
           t.dtad_from::date, t.dtad_to::date, t.dtterm_from::date,
t.dtterm_to::date, t.dtif_from::date, t.dtif_to::date
    FROM _t t JOIN lucy.vw_docs_txt_mat d ON t.doc_id = d.doc_id
    GROUP BY t.id, t.doc_id, t.score, t.dt::date, d.typ
    ORDER BY t.id-- DESC
    OFFSET _offset LIMIT _count
  LOOP
    -- CONTINUE WHEN _jdt IS NULL OR _jdt < _dt_from OR _jdt > _dt_to;
    RETURN NEXT;
  END LOOP;
  --
  DROP TABLE _t;
raise notice '%', 'passes here';
END;$$language plpgsql;


В списке pgsql-bugs по дате отправления:

Предыдущее
От: Amit Kapila
Дата:
Сообщение: Re: Re: BUG #15039: some question about hash index code
Следующее
От: PG Bug reporting form
Дата:
Сообщение: BUG #15041: dsa alloc_object null pointer