Open zverevgeny opened 3 weeks ago
Где тест, или как это воспроизводить?
@Darych, допиши сюда, пожалуйста, минимальный пример воспроизводящий ошибку
PRAGMA dq.HashJoinMode = "grace";
pragma dq.ComputeActorType="sync";
pragma dq.OptLLVM="off";
PRAGMA s3.UseBlocksSource="true";
pragma dq.MaxTasksPerStage="1";
pragma config.flags="LLVM_OFF";
pragma dq.UseFinalizeByKey="true";
pragma AnsiOptionalAs="1";
$max_store_sales =
(select max(csales) tpcds_cmax
from (select sum(ss_quantity*ss_sales_price) csales
from bindings.store_sales as store_sales
cross join bindings.customer as customer
cross join bindings.date_dim as date_dim
where
-- ss_customer_sk is not null and ss_sold_date_sk is not null
and ss_customer_sk = c_customer_sk
and ss_sold_date_sk = d_date_sk
group by customer.c_customer_sk) x);
select customer.c_customer_sk c_customer_sk,sum(ss_quantity*ss_sales_price) ssales
from bindings.store_sales as store_sales
cross join bindings.customer as customer
where ss_customer_sk = c_customer_sk
group by customer.c_customer_sk
having sum(ss_quantity*ss_sales_price) > (95/100.0) * $max_store_sales;
Собрал покороче пример на котором воспроизводится проблема. Биндинги из TPC-DS Лог с проблемой прикреплен run_failed.log
Если в примере запроса расскоментить строку с фильтром на NOT NULL, то запрос проходит. Лог прикреплен как run.log
Дело в том, что в таблице store_sales в колонках ss_customer_sk и ss_sold_date_sk могут быть NULL. А они являются ключами джоина. В JoinDict в случае Inner join мы требуем, чтобы ключи джоина были не NULL. run.log run_failed.log bindings.json
Понятней не стало. Чем это воспроизводится? Можно в виде теста куда-то в github положить?
Получилось запустить на dqrun и запрос успешно отработал.
q23 или q23 с FinalizeByKey
?
Только что проверил,
https://gist.github.com/yumkam/72a58da03d56b0ef21ab9d90155c4ff2
валится
Взял это запрос и эти биндинги и всё отработло. Не понимаю что я не так делаю.
И ещё не понятно откуда вообще может браться JoinDict? После перехода на GraceJoin он уже не должен возникать вообще никогда.
Можно сравнить логи, plan, ast и результат. Я добавил в gist для падающего (-fbk) и не падающего (-no-fbk) вариантов.
Там нечего сравнивать ибо JoinDict вообще не должен возникать никогда, даже если отработал правильно. Надо подебажить оптимайзер и посмотреть почему он возник. А gateways.cfg можно сюда положить?
Почти не отличается от dqrun/examples/gateways.conf. Добавил в gist.
А какие опции сборки у dqrun
? Если release
, то там отключены assert
, и он просто молча проглатывает багу (бага при этом остаётся багой: JoinDict
не умеет отрабатывать NULL
и само его применение является ошибкой).
(В relwithdebinfo
, не только отладочная информация, но и, внезапно, assert
не отключены)
Дело в том, что в таблице store_sales в колонках ss_customer_sk и ss_sold_date_sk могут быть NULL. А они являются ключами джоина. В JoinDict в случае Inner join мы требуем, чтобы ключи джоина были не NULL.