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 по дате отправления: