Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

incorrect result #53

Closed
Closed
@parihaaraka

Description

Postgres Pro, официальный репозиторий, версия 9.6, debian 8.6 x64

DISCARD PLANS;
with tmp as
(
	select tid
	from transport.transaction_specdata
	where state_code != transport.get_state_code_by_name('processing')
)
select *
from main.transaction t
	join tmp on t.id = tmp.tid;

выдает пустую выборку. Если заменить вызов функции transport.get_state_code_by_name() на константу, то запрос отрабатывает корректно. Также запрос отрабатывает корректно со второго раза без DISCARD PLANS. main.transaction разбита на разделы, но поле pdate (см.ниже), по которому производится партицирование, не используется (если использовать, то проблема остается - просто сократили пример).

CREATE OR REPLACE FUNCTION transport.get_state_code_by_name(_state_name text)
 RETURNS smallint AS ...
 LANGUAGE plpgsql STABLE;

Более того, в практическом применении функция не вызывается так, как указано выше. Вот реальная функция, которая вообще не работает (del_trn всегда пустой) с любыми манипуляциями снаружи:

CREATE OR REPLACE FUNCTION transport.garbage_collector(_max_store_time interval)
 RETURNS void AS
$BODY$
declare
	_cur_tid bigint;
	_processing_code smallint := transport.get_state_code_by_name('processing');
BEGIN
	for _cur_tid in 
		with tmp as
		(
			select tid, regtime::date as pdate, test_mode, state_code
			from transport.transaction_specdata
			where regtime < (now() - _max_store_time) and
				(test_mode > 0 or state_code != _processing_code)
		),
		del_trn as
		(
			-- delete test-mode transactions
			delete from main.transaction t
			using tmp
			where t.id = tmp.tid and t.pdate = tmp.pdate and tmp.test_mode > 0
		)
		delete from transport.transaction_specdata s
		using tmp
		where s.tid = tmp.tid and tmp.state_code != _processing_code
		returning s.tid
	loop
		raise notice '[Garbage collector][tid=%] The transaction was deleted', _cur_tid;
	end loop;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;

Проект накануне запуска. Кажется, придется делать всё по-старинке :(

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

        AltStyle によって変換されたページ (->オリジナル) /