https://s3.amazonaws.com/clickhouse-test-reports/42778/66c179217cdfdee1ba0d4b4b577b1a62655caed0/fuzzer_astfuzzermsan//report.html

Minimal example
```sql
#!/usr/bin/clickhouse-client --queries-file

DROP TABLE IF EXISTS tab1;
DROP TABLE IF EXISTS tab2;

SET allow_suspicious_low_cardinality_types = 1;

create table tab1 (a1 Int32, b1 Int32) engine = MergeTree order by a1;
create table tab2 (a2 LowCardinality(Int32), b2 Int32) engine = MergeTree order by a2;

insert into tab1 values (1, 2);
insert into tab2 values (1, 2);

SET join_use_nulls = 1;

SELECT 1 FROM tab1 FULL OUTER JOIN tab2 ON b1 - 2 = a2 OR a1 = b2;

```
{
    for (const auto & onexpr : table_join->getClauses())
    {
        JoinCommon::checkTypesOfKeys(block, onexpr.key_names_left, right_table_keys, onexpr.key_names_right);
    }
}
void HashJoin::joinBlock(Block & block, ExtraBlockPtr & not_processed)
{
    for (const auto & onexpr : table_join->getClauses())
    {
        auto cond_column_name = onexpr.condColumnNames();
        JoinCommon::checkTypesOfKeys(
            block, onexpr.key_names_left, cond_column_name.first,
            right_sample_block, onexpr.key_names_right, cond_column_name.second);
    }
    if (kind == JoinKind::Cross)
    {
        joinBlockImplCross(block, not_processed);
        return;
    }
    if (kind == JoinKind::Right || kind == JoinKind::Full)