aboutsummaryrefslogtreecommitdiffstats
path: root/yt/yql/tests/sql/suites/join
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2024-12-28 18:52:49 +0300
committervvvv <vvvv@yandex-team.com>2024-12-28 19:08:05 +0300
commit8edc031b752662cb60f411a2d7d3d6c162d801cf (patch)
treec78646d3f4c02c56d8e5659af94aa338df9e5447 /yt/yql/tests/sql/suites/join
parent4e51cb9d47a86fee833396ad0cdfb8e84ec8166c (diff)
downloadydb-8edc031b752662cb60f411a2d7d3d6c162d801cf.tar.gz
Change "devtools/contrib/piglet/projects/ydblib/config.yaml"
commit_hash:bf8be6eaf53bc3065d37ec3eeb7b664ca9d6b76d
Diffstat (limited to 'yt/yql/tests/sql/suites/join')
-rw-r--r--yt/yql/tests/sql/suites/join/aggr_diff_order.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/alias_where_group-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/alias_where_group.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/alias_where_group.sql16
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_dup-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_dup.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_dup.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.sql23
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodup-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodup.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_common_nodup.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_merge_nodup-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/branch.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_dis_in_in_in.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in_in-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/bush_in_in_in.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables.sql18
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_a.txt.attr61
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_b.txt.attr34
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_c.txt.attr34
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_d.txt.attr50
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/commonjoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/commonjoin_unused_keys.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/compact_join.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/compact_join.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/convert_key-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/convert_key.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/convert_key.sql31
-rw-r--r--yt/yql/tests/sql/suites/join/convert_key.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/join/count_bans-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/count_bans.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/count_bans.sql45
-rw-r--r--yt/yql/tests/sql/suites/join/default.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/empty_dynamic.txt.attr22
-rw-r--r--yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_by_expr-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_by_expr.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_by_expr.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_simple-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_simple.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_three_simple.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_two_mult_keys-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/filter_joined-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/filter_joined.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/filter_joined.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns1-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns1.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns1.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns2-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns2.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/flatten_columns2.sql20
-rw-r--r--yt/yql/tests/sql/suites/join/force_merge_join.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/from_in_front_join-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/from_in_front_join.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/from_in_front_join.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_not_null-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_not_null.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_not_null.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_null-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_null.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/full_equal_null.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/full_join-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/full_join.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/full_join.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial.sql5
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial_udf_call-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial_udf_call.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/full_trivial_udf_call.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/gj_countries1.txt.attr18
-rw-r--r--yt/yql/tests/sql/suites/join/gj_customers1.txt.attr18
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join1-grace.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join1-map.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join1-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join1.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join1.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join2.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/grace_join2.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/group_compact_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/group_compact_by.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all_right-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all_right.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_all_right.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped_by_expr-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped_by_expr.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_grouped_by_expr.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/inner_on_key_only-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_on_key_only.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_on_key_only.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/inner_table_and_view.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial_from_concat-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial_from_concat.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_trivial_from_concat.sql3
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_order-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_order.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_order.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_select-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_select.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/inner_with_select.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/input6.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/join/input8.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/join/input9.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/join/input_left.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/join/input_right.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/join/join_and_distinct_key-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/join_and_distinct_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/join_and_distinct_key.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/join_cbo_3_tables.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/join_cbo_3_tables.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_common_table-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_common_table.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_common_table.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_map_table-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_map_table.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/join_comp_map_table.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/join_key_cmp_udf-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/join_key_cmp_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_key_cmp_udf.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/join_left_cbo.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_left_cbo.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/join_right_cbo.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_right_cbo.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/join_table_conflict_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_table_conflict_fail.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/join_with_dot_without_alias.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_column-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_column.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_column.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.sql22
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.sql18
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_names-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_names.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/join_without_correlation_names.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/kv1_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv1_sorted1.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv2_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv2_sorted1.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv3_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv4_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/kv5_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/leaf.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/join/left_all-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_all.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_all.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/left_cast_to_string-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_cast_to_string.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_cast_to_string.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_input1.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_input2.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_input3.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_null_column-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_null_column.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_null_column.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/left_null_literal-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/left_null_literal.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/left_null_literal.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_semi_and_other-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_semi_and_other.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_semi_and_other.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_with_other-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_with_other.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_only_with_other.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/left_semi_with_other-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_semi_with_other.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_semi_with_other.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/left_trivial-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/left_trivial.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/left_trivial.sql5
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.sql30
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.sql28
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug8533-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug8533.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_bug8533.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_2o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_not_selected-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_not_selected.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_not_selected.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_2o-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_empty-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_subq-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_take_skip.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_take_skip.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_with_cache-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_with_cache.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/lookupjoin_with_cache.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_dup_key-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_dup_key.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_dup_key.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence-off.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_left_null_column-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_left_null_column.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_left_null_column.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.sql16
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.sql23
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.sql18
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_sharded.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_unused_keys.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_anonymous-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_read-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.sql20
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.sql5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align1-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align1.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align1.sql26
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align2-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align2.sql22
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align3-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align3.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_align3.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.sql5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_per_link-off.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_per_link.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_force_per_link.sql18
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_input1.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_input2.txt.attr60
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_left_null_column-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_left_null_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_left_null_column.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.sql42
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner-off.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_small_primary-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_small_primary.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_small_primary.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_unused_keys.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.sql19
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_table_range-off.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_table_range.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/mergejoin_with_table_range.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/nested_semi_join-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/nested_semi_join.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/nested_semi_join.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/no_empty_join_for_dyn-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side.sql20
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.sql24
-rw-r--r--yt/yql/tests/sql/suites/join/order_of_qualified-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/order_of_qualified.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/order_of_qualified.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_cross-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_cross.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_cross.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_both_sides-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_filter-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_filter.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_inner_filter.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_left_cross-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_left_cross.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_left_cross.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_right_tablecontent-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_semi-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_semi.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_common_semi.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_context_dep-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_context_dep.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_context_dep.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_cross-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_cross.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_cross.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_inner-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_inner.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_inner.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_semi-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_semi.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/premap_map_semi.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort1-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort1.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort1.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort2-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort2.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_extrasort2.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_inner-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_inner.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_inner.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_with_remap-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_with_remap.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/premap_merge_with_remap.sql17
-rw-r--r--yt/yql/tests/sql/suites/join/premap_no_premap-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_no_premap.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_no_premap.sql27
-rw-r--r--yt/yql/tests/sql/suites/join/premap_nonseq_flatmap-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_context_dep-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_context_dep.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_context_dep.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_cross-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_cross.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_cross.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_exclusion-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_exclusion.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_exclusion.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_inner-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_inner.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_inner.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left_semi-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left_semi.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_left_semi.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_null_column-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_null_column.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_null_column.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_random-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_random.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_random.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_renaming-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_renaming.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_renaming.sql8
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_rownumber-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_rownumber.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pullup_rownumber.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_left-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_left.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/pushdown_filter_over_left.sql6
-rw-r--r--yt/yql/tests/sql/suites/join/right_trivial-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/right_trivial.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/right_trivial.sql5
-rw-r--r--yt/yql/tests/sql/suites/join/root.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-replicate.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.sql4
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.sql2
-rw-r--r--yt/yql/tests/sql/suites/join/simple_columns_partial-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/simple_columns_partial.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/simple_columns_partial.sql23
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_k1.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_k2.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_key1.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_key2.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_key3.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_key4.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_key_subkey.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv1.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv1_1.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv1_dup.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv1_opt.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv1_unique.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv2.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv2_dup.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv2_empty.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv2_opt.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_by_kv3.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_uniq.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_uniq1.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/join/sorted_uniq2.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/join/split_to_list_as_key-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/split_to_list_as_key.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/split_to_list_as_key.sql7
-rw-r--r--yt/yql/tests/sql/suites/join/star_join-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/star_join.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_premap-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_premap.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_premap.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_mirror-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_mirror.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_mirror.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_multi-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_multi.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_multi.sql22
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly_premap-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly_premap.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_semionly_premap.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/starjoin_unused_keys.cfg6
-rw-r--r--yt/yql/tests/sql/suites/join/starjoin_unused_keys.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/strict_keys.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/strict_keys.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities_paren-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities_paren.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/three_equalities_paren.sql11
-rw-r--r--yt/yql/tests/sql/suites/join/trivial_view-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/trivial_view.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/trivial_view.sql9
-rw-r--r--yt/yql/tests/sql/suites/join/two_aggrs.sql18
-rw-r--r--yt/yql/tests/sql/suites/join/uniqkeys.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/join/view_input.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/join/vk1_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/vk2_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/vk3_sorted.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/yql-12022-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/yql-12022.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-12022.sql13
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_left-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_left.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_left.sql35
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_leftonly-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_leftonly.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14829_leftonly.sql35
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14847-off.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14847.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/yql-14847.sql23
-rw-r--r--yt/yql/tests/sql/suites/join/yql-16011.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/yql-16011.sql27
-rw-r--r--yt/yql/tests/sql/suites/join/yql-19081.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/yql-19081.sql12
-rw-r--r--yt/yql/tests/sql/suites/join/yql-4275-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/yql-4275.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/yql-4275.sql10
-rw-r--r--yt/yql/tests/sql/suites/join/yql-4275.txt.attr40
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8125-off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8125.cfg1
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8125.sql29
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8131-off.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8131.cfg3
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8131.sql14
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8980-off.cfg7
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8980.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/yql-8980.sql15
-rw-r--r--yt/yql/tests/sql/suites/join/yql_465-off.cfg4
-rw-r--r--yt/yql/tests/sql/suites/join/yql_465.cfg2
-rw-r--r--yt/yql/tests/sql/suites/join/yql_465.sql3
664 files changed, 5427 insertions, 0 deletions
diff --git a/yt/yql/tests/sql/suites/join/aggr_diff_order.sql b/yt/yql/tests/sql/suites/join/aggr_diff_order.sql
new file mode 100644
index 0000000000..21762aa6c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/aggr_diff_order.sql
@@ -0,0 +1,14 @@
+USE plato;
+
+PRAGMA yt.JoinMergeForce = "1";
+pragma yt.JoinMergeTablesLimit="10";
+
+SELECT key1, subkey1
+FROM
+ (
+ SELECT a.key as key1, a.subkey as subkey1
+ FROM ANY (SELECT * FROM Input8 WHERE subkey != "bar") AS a
+ JOIN ANY (SELECT * FROM Input8 WHERE subkey != "foo") AS b
+ ON a.key = b.key AND a.subkey = b.subkey
+ )
+GROUP COMPACT BY subkey1, key1;
diff --git a/yt/yql/tests/sql/suites/join/alias_where_group-off.cfg b/yt/yql/tests/sql/suites/join/alias_where_group-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/alias_where_group-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/alias_where_group.cfg b/yt/yql/tests/sql/suites/join/alias_where_group.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/alias_where_group.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/alias_where_group.sql b/yt/yql/tests/sql/suites/join/alias_where_group.sql
new file mode 100644
index 0000000000..bc7f28419c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/alias_where_group.sql
@@ -0,0 +1,16 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+SELECT
+ key,
+ subkey
+FROM Input3 as ia
+INNER JOIN Input4 as ib
+USING(key)
+WHERE
+ ib.subkey = '2'
+GROUP BY
+ ia.key as key,
+ ia.value as subkey
+ORDER BY key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_dup-off.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_dup-off.cfg
new file mode 100644
index 0000000000..ada3709d76
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_dup-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_dup.txt
+in Input2 sorted_by_kv2_dup.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_dup.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_dup.cfg
new file mode 100644
index 0000000000..5186b3d003
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_dup.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_dup.txt
+in Input2 sorted_by_kv2_dup.txt
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_dup.sql b/yt/yql/tests/sql/suites/join/anyjoin_common_dup.sql
new file mode 100644
index 0000000000..977215d43a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_dup.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+select * from Input1 as a right join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a right join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from Input1 as a right join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a right join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys-off.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.sql b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.sql
new file mode 100644
index 0000000000..bbde851b43
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodata_keys.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+
+$a = SELECT AsTuple(1, 2) AS k1, 1 AS k2, 2 AS v;
+
+$b = SELECT AsTuple(1, 2) AS k1, 1 AS k2, 3 AS v1
+ UNION ALL
+ SELECT AsTuple(1, 2) AS k1, 1 AS k2, 3 AS v1;
+
+INSERT INTO @a
+SELECT * FROM $a;
+
+INSERT INTO @b
+SELECT * FROM $b;
+
+COMMIT;
+
+SELECT * FROM @a AS a LEFT JOIN ANY @b AS b using(k1,k2);
+SELECT * FROM @a AS a LEFT JOIN @b AS b using(k1,k2);
+
+
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodup-off.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.cfg b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.sql b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.sql
new file mode 100644
index 0000000000..977215d43a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_common_nodup.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+select * from Input1 as a right join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a right join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from Input1 as a right join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a right join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup-off.cfg b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.cfg b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.sql b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.sql
new file mode 100644
index 0000000000..7d9a857905
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/anyjoin_merge_nodup.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+
+select * from Input1 as a join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a join Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from Input1 as a join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+select * from any Input1 as a join any Input2 as b on a.k1 = b.k2 order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/branch.txt.attr b/yt/yql/tests/sql/suites/join/branch.txt.attr
new file mode 100644
index 0000000000..4a77dc3233
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/branch.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["leaf";["OptionalType";["DataType";"Uint64"]]];
+ ["value";["OptionalType";["DataType";"String"]]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in.sql b/yt/yql/tests/sql/suites/join/bush_dis_in.sql
new file mode 100644
index 0000000000..82a9d54d6f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+select * from (
+ SELECT DISTINCT i1.key AS Key, i1.value as Value, i2.value as Join
+ FROM Roots AS i1
+ INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+ UNION ALL
+ SELECT DISTINCT i1.key AS Key, i1.value as Value, i2.value as Join
+ FROM Roots AS i1
+ INNER JOIN Branches AS i2 ON i1.branch = i2.key
+) order by Key, Value, Join;
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in.sql b/yt/yql/tests/sql/suites/join/bush_dis_in_in.sql
new file mode 100644
index 0000000000..bd1989e82d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT DISTINCT i1.key AS Key, i1.value AS Value, i2.value AS Leaf, i3.value AS Branch
+FROM Roots AS i1
+INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+INNER JOIN Branches AS i3 ON i1.branch = i3.key
+ORDER BY Leaf, Branch;
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.cfg b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.sql b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.sql
new file mode 100644
index 0000000000..22d12df7c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_dis_in_in_in.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT DISTINCT i1.key AS Key, i1.value as Value, i2.value As Leaf, i3.value AS Branch, i4.value AS Branch_Leaf
+FROM Roots AS i1
+INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+INNER JOIN Branches AS i3 ON i1.branch = i3.key
+INNER JOIN Leaves AS i4 ON i3.leaf = i4.key
+ORDER BY Leaf, Branch, Branch_Leaf;
diff --git a/yt/yql/tests/sql/suites/join/bush_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_in.cfg b/yt/yql/tests/sql/suites/join/bush_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_in.sql b/yt/yql/tests/sql/suites/join/bush_in.sql
new file mode 100644
index 0000000000..af77ba34e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+select * from (
+ SELECT i1.key AS Key, i1.value as Value, i2.value as Join
+ FROM Roots AS i1
+ INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+ UNION ALL
+ SELECT i1.key AS Key, i1.value as Value, i2.value as Join
+ FROM Roots AS i1
+ INNER JOIN Branches AS i2 ON i1.branch = i2.key
+) order by Key, Value, Join;
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_in_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in.cfg b/yt/yql/tests/sql/suites/join/bush_in_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in.sql b/yt/yql/tests/sql/suites/join/bush_in_in.sql
new file mode 100644
index 0000000000..bf385a0ea9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT i1.key AS Key, i1.value AS Value, i2.value AS Leaf, i3.value AS Branch
+FROM Roots AS i1
+INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+INNER JOIN Branches AS i3 ON i1.branch = i3.key
+ORDER BY Leaf, Branch;
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in_in-off.cfg b/yt/yql/tests/sql/suites/join/bush_in_in_in-off.cfg
new file mode 100644
index 0000000000..f091bc1467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in_in-off.cfg
@@ -0,0 +1,5 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in_in.cfg b/yt/yql/tests/sql/suites/join/bush_in_in_in.cfg
new file mode 100644
index 0000000000..684f34abfd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in_in.cfg
@@ -0,0 +1,3 @@
+in Roots root.txt
+in Leaves leaf.txt
+in Branches branch.txt
diff --git a/yt/yql/tests/sql/suites/join/bush_in_in_in.sql b/yt/yql/tests/sql/suites/join/bush_in_in_in.sql
new file mode 100644
index 0000000000..901aa219d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/bush_in_in_in.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT i1.key AS Key, i1.value as Value, i2.value As Leaf, i3.value AS Branch, i4.value AS Branch_Leaf
+FROM Roots AS i1
+INNER JOIN Leaves AS i2 ON i1.leaf = i2.key
+INNER JOIN Branches AS i3 ON i1.branch = i3.key
+INNER JOIN Leaves AS i4 ON i3.leaf = i4.key;
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables.cfg b/yt/yql/tests/sql/suites/join/cbo_4tables.cfg
new file mode 100644
index 0000000000..a5101acc8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables.cfg
@@ -0,0 +1,5 @@
+providers yt
+in InputA cbo_4tables_a.txt
+in InputB cbo_4tables_b.txt
+in InputC cbo_4tables_c.txt
+in InputD cbo_4tables_d.txt
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables.sql b/yt/yql/tests/sql/suites/join/cbo_4tables.sql
new file mode 100644
index 0000000000..1629efa144
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables.sql
@@ -0,0 +1,18 @@
+/* ytfile can not */
+USE plato;
+pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS
+
+pragma CostBasedOptimizer="native";
+pragma yt.MapJoinLimit="1000";
+pragma yt.LookupJoinLimit="1000";
+pragma yt.LookupJoinMaxRows="100";
+pragma yt.ExtendedStatsMaxChunkCount="0";
+pragma yt.JoinMergeTablesLimit="100";
+
+SELECT
+ InputA.Key1, InputA.Key2, InputA.Value, InputB.val, InputC.v, InputD.value as vald
+FROM
+ InputA
+ INNER JOIN InputD ON InputA.Key2 = InputD.k
+ INNER JOIN InputB ON InputA.Fk1 = InputB.k
+ INNER JOIN InputC ON InputA.Key1 = InputC.k
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_a.txt.attr b/yt/yql/tests/sql/suites/join/cbo_4tables_a.txt.attr
new file mode 100644
index 0000000000..295e5a3d06
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_a.txt.attr
@@ -0,0 +1,61 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["Key1";["DataType";"Int32"]];
+ ["Key2";["DataType";"String"]];
+ ["Fk1";["OptionalType";["DataType";"String"]]];
+ ["Value";["OptionalType";["DataType";"String"]]]]
+ ];
+ "SortDirections"=[1;1];
+ "SortedBy"=["Key1";"Key2"];
+ "SortedByTypes"=[["DataType";"Int32";];["DataType";"String"]];
+ "SortMembers"=["Key1";"Key2"];
+ };
+ "schema" = <"strict" = %true; "unique_keys" = %false>
+ [
+ {
+ "name" = "Key1";
+ "sort_order" = "ascending";
+ "type" = "int64";
+ "type_v3" = {"type_name" = "optional"; item = "int64"}
+ };
+ {
+ "name" = "Key2";
+ "sort_order" = "ascending";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ {
+ "name" = "Fk1";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ {
+ "name" = "Value";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ ];
+ "extended_stats" = [
+ {
+ "column_name" = "Key1";
+ "data_weight" = 56;
+ "num_unique_vals" = 11;
+ };
+ {
+ "column_name" = "Key2";
+ "data_weight" = 66;
+ "num_unique_vals" = 5;
+ };
+ {
+ "column_name" = "Fk1";
+ "data_weight" = 70;
+ "num_unique_vals" = 5;
+ };
+ {
+ "column_name" = "Value";
+ "data_weight" = 98;
+ "num_unique_vals" = 6;
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_b.txt.attr b/yt/yql/tests/sql/suites/join/cbo_4tables_b.txt.attr
new file mode 100644
index 0000000000..460ca717f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_b.txt.attr
@@ -0,0 +1,34 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k";["OptionalType";["DataType";"String"]]];
+ ["val";["OptionalType";["DataType";"String"]]]]
+ ];
+ };
+
+ "schema" = <"strict" = %true; "unique_keys" = %false>
+ [
+ {
+ "name" = "k";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ {
+ "name" = "val";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ ];
+ "extended_stats" = [
+ {
+ "column_name" = "k";
+ "data_weight" = 18;
+ "num_unique_vals" = 2;
+ };
+ {
+ "column_name" = "val";
+ "data_weight" = 20;
+ "num_unique_vals" = 3;
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_c.txt.attr b/yt/yql/tests/sql/suites/join/cbo_4tables_c.txt.attr
new file mode 100644
index 0000000000..fb108546cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_c.txt.attr
@@ -0,0 +1,34 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k";["OptionalType";["DataType";"Int64"]]];
+ ["v";["OptionalType";["DataType";"Int64"]]]]
+ ];
+ };
+
+ "schema" = <"strict" = %true; "unique_keys" = %false>
+ [
+ {
+ "name" = "k";
+ "type" = "int64";
+ "type_v3" = {"type_name" = "optional"; item = "int64"}
+ };
+ {
+ "name" = "v";
+ "type" = "int64";
+ "type_v3" = {"type_name" = "optional"; item = "int64"}
+ };
+ ];
+ "extended_stats" = [
+ {
+ "column_name" = "k";
+ "data_weight" = 12;
+ "num_unique_vals" = 3;
+ };
+ {
+ "column_name" = "v";
+ "data_weight" = 12;
+ "num_unique_vals" = 3;
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_d.txt.attr b/yt/yql/tests/sql/suites/join/cbo_4tables_d.txt.attr
new file mode 100644
index 0000000000..8050807ed9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_d.txt.attr
@@ -0,0 +1,50 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["id";["DataType";"Int32"]];
+ ["k";["OptionalType";["DataType";"String"]]];
+ ["value";["OptionalType";["DataType";"Int64"]]]]
+ ];
+ "SortDirections"=[1];
+ "SortedBy"=["id"];
+ "SortedByTypes"=[["DataType";"Int32"]];
+ "SortMembers"=["id"];
+ };
+
+ "schema" = <"strict" = %true; "unique_keys" = %false>
+ [
+ {
+ "name" = "id";
+ "sort_order" = "ascending";
+ "type" = "int64";
+ "type_v3" = {"type_name" = "optional"; item = "int64"}
+ };
+ {
+ "name" = "k";
+ "type" = "string";
+ "type_v3" = {"type_name" = "optional"; item = "string"}
+ };
+ {
+ "name" = "value";
+ "type" = "int64";
+ "type_v3" = {"type_name" = "optional"; item = "int64"}
+ };
+ ];
+ "extended_stats" = [
+ {
+ "column_name" = "id";
+ "data_weight" = 44;
+ "num_unique_vals" = 11;
+ };
+ {
+ "column_name" = "k";
+ "data_weight" = 66;
+ "num_unique_vals" = 7;
+ };
+ {
+ "column_name" = "value";
+ "data_weight" = 44;
+ "num_unique_vals" = 6;
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.cfg b/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.cfg
new file mode 100644
index 0000000000..a5101acc8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.cfg
@@ -0,0 +1,5 @@
+providers yt
+in InputA cbo_4tables_a.txt
+in InputB cbo_4tables_b.txt
+in InputC cbo_4tables_c.txt
+in InputD cbo_4tables_d.txt
diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.sql b/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.sql
new file mode 100644
index 0000000000..7d5eddb167
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/cbo_4tables_only_sorted_merge.sql
@@ -0,0 +1,19 @@
+/* ytfile can not */
+USE plato;
+pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS
+
+pragma CostBasedOptimizer="native";
+pragma yt.MapJoinLimit="1000";
+pragma yt.LookupJoinLimit="1000";
+pragma yt.LookupJoinMaxRows="100";
+pragma yt.ExtendedStatsMaxChunkCount="0";
+pragma yt.JoinMergeTablesLimit="100";
+pragma yt.JoinMergeForce="true";
+
+SELECT
+ InputA.Key1, InputA.Key2, InputA.Value, InputB.val, InputC.v, InputD.value as vald
+FROM
+ InputA
+ INNER JOIN InputD ON InputA.Key2 = InputD.k
+ INNER JOIN InputB ON InputA.Fk1 = InputB.k
+ INNER JOIN InputC ON InputA.Key1 = InputC.k
diff --git a/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.sql
new file mode 100644
index 0000000000..8d4a07952d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/commonjoin_unused_keys.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+use plato;
+
+select
+
+v3
+
+from Input1 as a
+join Input2 as b on (a.k1 = b.k2)
+join Input3 as c on (a.k1 = c.k3)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/compact_join.cfg b/yt/yql/tests/sql/suites/join/compact_join.cfg
new file mode 100644
index 0000000000..936236defd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/compact_join.cfg
@@ -0,0 +1,2 @@
+in InputLeft input_left.txt
+in InputRight input_right.txt
diff --git a/yt/yql/tests/sql/suites/join/compact_join.sql b/yt/yql/tests/sql/suites/join/compact_join.sql
new file mode 100644
index 0000000000..505bdb34fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/compact_join.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+$stream = SELECT a.k AS k, a.sk AS ask, a.v AS av
+FROM InputLeft AS a
+INNER JOIN /*+ merge() compact() */ InputRight AS b
+USING (k, sk, v);
+
+SELECT k, ask, av
+FROM $stream
+GROUP /*+ compact() */ BY (k, ask, av)
+ORDER BY k, ask, av; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/convert_key-off.cfg b/yt/yql/tests/sql/suites/join/convert_key-off.cfg
new file mode 100644
index 0000000000..9e8955692d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/convert_key-off.cfg
@@ -0,0 +1,4 @@
+in Input convert_key.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/convert_key.cfg b/yt/yql/tests/sql/suites/join/convert_key.cfg
new file mode 100644
index 0000000000..dd4bfb988d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/convert_key.cfg
@@ -0,0 +1,2 @@
+in Input convert_key.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/convert_key.sql b/yt/yql/tests/sql/suites/join/convert_key.sql
new file mode 100644
index 0000000000..0d5ca60885
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/convert_key.sql
@@ -0,0 +1,31 @@
+/* postgres can not */
+USE plato;
+
+PRAGMA SimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+$join_result =
+(
+ SELECT
+ i1.k1 as i1_k1,
+ i1.k2 as i1_k2,
+ i1.value as i1_value,
+ i2.k1 as i2_k1,
+ i2.k2 as i2_k2,
+ i2.value as i2_value
+ FROM
+ Input as i1
+ LEFT JOIN
+ (
+ SELECT
+ i2.value as value,
+ cast(i2.k1 as double) as k1,
+ cast(i2.k2 as double) as k2
+ FROM Input as i2
+ ) as i2
+ ON
+ i1.k1 == i2.k1 AND
+ i1.k2 == i2.k2
+);
+
+SELECT * FROM $join_result;
diff --git a/yt/yql/tests/sql/suites/join/convert_key.txt.attr b/yt/yql/tests/sql/suites/join/convert_key.txt.attr
new file mode 100644
index 0000000000..63d2666582
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/convert_key.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k1";["DataType";"Int64"]];
+ ["k2";["DataType";"Int64"]];
+ ["value";["DataType";"String"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/join/count_bans-off.cfg b/yt/yql/tests/sql/suites/join/count_bans-off.cfg
new file mode 100644
index 0000000000..764ce5fc59
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/count_bans-off.cfg
@@ -0,0 +1,4 @@
+in spider_info spider_info.txt
+udf url_udf
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/count_bans.cfg b/yt/yql/tests/sql/suites/join/count_bans.cfg
new file mode 100644
index 0000000000..2e4220b630
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/count_bans.cfg
@@ -0,0 +1,2 @@
+in spider_info spider_info.txt
+udf url_udf
diff --git a/yt/yql/tests/sql/suites/join/count_bans.sql b/yt/yql/tests/sql/suites/join/count_bans.sql
new file mode 100644
index 0000000000..499db2c7f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/count_bans.sql
@@ -0,0 +1,45 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$records = (
+SELECT
+ key as ip,
+ subkey AS recordType,
+ Url::GetHost(value) AS host
+FROM spider_info
+);
+
+$results = (
+SELECT
+ ip,
+ host,
+ count(*) AS request_count
+FROM $records
+WHERE host IS NOT NULL AND recordType == "RESULT"
+GROUP BY ip, host
+);
+
+$bans = (
+SELECT
+ ip,
+ host,
+ count(*) AS fetcher_count
+FROM $records
+WHERE host IS NOT NULL AND recordType == "BAN_DETECTED"
+GROUP BY ip, host
+);
+
+SELECT
+ results.ip AS ip,
+ results.host AS host,
+ results.request_count AS request_count,
+ bans.fetcher_count AS fetcher_count
+FROM
+ $results AS results
+ INNER JOIN
+ $bans AS bans
+ ON bans.ip == results.ip
+ AND bans.host == results.host
+ORDER BY fetcher_count DESC
+;
diff --git a/yt/yql/tests/sql/suites/join/default.cfg b/yt/yql/tests/sql/suites/join/default.cfg
new file mode 100644
index 0000000000..429c022594
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/default.cfg
@@ -0,0 +1,6 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+in Input8 input8.txt
diff --git a/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.cfg b/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.cfg
new file mode 100644
index 0000000000..89a1fdcc94
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv1_1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.sql b/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.sql
new file mode 100644
index 0000000000..314c680b69
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/do_not_suppres_equijoin_input_sorts.sql
@@ -0,0 +1,8 @@
+USE plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma DisableSimpleColumns;
+
+select
+ *
+from Input1 as t1 cross join Input2 as t2
+where t1.k1 == t2.k1 and t1.k1 < "zzz";
diff --git a/yt/yql/tests/sql/suites/join/empty_dynamic.txt.attr b/yt/yql/tests/sql/suites/join/empty_dynamic.txt.attr
new file mode 100644
index 0000000000..fad9c383f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/empty_dynamic.txt.attr
@@ -0,0 +1,22 @@
+{
+ "_yql_dynamic"=%true;
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %true
+ >[
+ {
+ "name" = "key";
+ "type" = "string";
+ "sort_order" = "ascending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "sort_order" = "ascending";
+ };
+ {
+ "name" = "value";
+ "type" = "string";
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.sql
new file mode 100644
index 0000000000..3e50bfd2df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/emptyjoin_unused_keys.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+use plato;
+
+insert into @Input1
+select '' as k1, '' as v1, '' as u1 limit 0;
+commit;
+
+select
+
+v3
+
+from @Input1 as a
+join Input2 as b on (a.k1 = b.k2)
+right join Input3 as c on (a.k1 = c.k3)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/equi_join_by_expr-off.cfg b/yt/yql/tests/sql/suites/join/equi_join_by_expr-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_by_expr-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/equi_join_by_expr.cfg b/yt/yql/tests/sql/suites/join/equi_join_by_expr.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_by_expr.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/equi_join_by_expr.sql b/yt/yql/tests/sql/suites/join/equi_join_by_expr.sql
new file mode 100644
index 0000000000..d2cad73469
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_by_expr.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT * FROM plato.Input2 as A JOIN plato.Input3 as B ON CAST(A.key AS INT) + 1 == CAST(B.key AS INT);
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk-off.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk-off.cfg
new file mode 100644
index 0000000000..3ff2f86249
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk-off.cfg
@@ -0,0 +1,5 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.cfg
new file mode 100644
index 0000000000..24c926d868
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.cfg
@@ -0,0 +1,3 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.sql b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.sql
new file mode 100644
index 0000000000..9c56228f58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT A.*, C.subkey as goal,B.*
+FROM plato.A
+JOIN plato.B ON A.key == B.key
+JOIN plato.C ON B.subkey == C.subkey
+ORDER BY A.key;
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval-off.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval-off.cfg
new file mode 100644
index 0000000000..3ff2f86249
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval-off.cfg
@@ -0,0 +1,5 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.cfg
new file mode 100644
index 0000000000..24c926d868
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.cfg
@@ -0,0 +1,3 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.sql b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.sql
new file mode 100644
index 0000000000..8ad0ef844c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_asterisk_eval.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT A.*, C.subkey as goal,B.*, A.value || C.value as ac_val_concat
+FROM plato.A
+JOIN plato.B ON A.key == B.key
+JOIN plato.C ON B.subkey == C.subkey
+ORDER BY A.key, goal, ac_val_concat;
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_simple-off.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_simple-off.cfg
new file mode 100644
index 0000000000..3ff2f86249
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_simple-off.cfg
@@ -0,0 +1,5 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_simple.cfg b/yt/yql/tests/sql/suites/join/equi_join_three_simple.cfg
new file mode 100644
index 0000000000..24c926d868
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_simple.cfg
@@ -0,0 +1,3 @@
+in A input1.txt
+in B input2.txt
+in C input4.txt
diff --git a/yt/yql/tests/sql/suites/join/equi_join_three_simple.sql b/yt/yql/tests/sql/suites/join/equi_join_three_simple.sql
new file mode 100644
index 0000000000..c620849a45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_three_simple.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT * FROM plato.A JOIN plato.B ON A.key == B.key JOIN plato.C ON A.subkey == C.subkey;
diff --git a/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys-off.cfg b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys-off.cfg
new file mode 100644
index 0000000000..c0badaaad9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys-off.cfg
@@ -0,0 +1,4 @@
+in A input1.txt
+in B input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.cfg b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.cfg
new file mode 100644
index 0000000000..661ab46dee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.cfg
@@ -0,0 +1,2 @@
+in A input1.txt
+in B input4.txt
diff --git a/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.sql b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.sql
new file mode 100644
index 0000000000..1119ca50ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/equi_join_two_mult_keys.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT * FROM plato.A JOIN plato.B ON A.key == B.key AND A.subkey == B.subkey;
diff --git a/yt/yql/tests/sql/suites/join/filter_joined-off.cfg b/yt/yql/tests/sql/suites/join/filter_joined-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/filter_joined-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/filter_joined.cfg b/yt/yql/tests/sql/suites/join/filter_joined.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/filter_joined.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/filter_joined.sql b/yt/yql/tests/sql/suites/join/filter_joined.sql
new file mode 100644
index 0000000000..2b75c56856
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/filter_joined.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+SELECT b.key
+FROM Input2 as a
+RIGHT JOIN Input3 as b ON a.key == b.key
+WHERE a.key IS NULL
+ORDER BY b.key;
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns1-off.cfg b/yt/yql/tests/sql/suites/join/flatten_columns1-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns1-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns1.cfg b/yt/yql/tests/sql/suites/join/flatten_columns1.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns1.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns1.sql b/yt/yql/tests/sql/suites/join/flatten_columns1.sql
new file mode 100644
index 0000000000..ada242dc80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns1.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+SELECT * FROM (
+SELECT
+ AsStruct(key as key, subkey as subkey),
+ AsStruct("value: " || value as value)
+FROM Input1
+) as a
+FLATTEN COLUMNS
+JOIN Input2
+USING (key)
+ORDER BY Input2.key;
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns2-off.cfg b/yt/yql/tests/sql/suites/join/flatten_columns2-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns2-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns2.cfg b/yt/yql/tests/sql/suites/join/flatten_columns2.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns2.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/flatten_columns2.sql b/yt/yql/tests/sql/suites/join/flatten_columns2.sql
new file mode 100644
index 0000000000..9ae2d879e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/flatten_columns2.sql
@@ -0,0 +1,20 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+SELECT * FROM (
+SELECT
+ AsStruct(key as key, subkey as subkey),
+ AsStruct("value1: " || value as value)
+FROM Input1
+) as a
+FLATTEN COLUMNS
+JOIN (
+SELECT
+ AsStruct(key as key, subkey as subkey),
+ AsStruct("value2: " || value as value)
+FROM Input2
+) as b
+FLATTEN COLUMNS
+USING (key)
+ORDER BY a.key;
diff --git a/yt/yql/tests/sql/suites/join/force_merge_join.sql b/yt/yql/tests/sql/suites/join/force_merge_join.sql
new file mode 100644
index 0000000000..80aaedfb0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/force_merge_join.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+PRAGMA yt.JoinMergeForce = "1";
+pragma yt.JoinMergeTablesLimit="10";
+
+SELECT a.key as key1
+ FROM (SELECT * FROM plato.Input1 WHERE subkey != "bar") AS a
+ JOIN (SELECT * FROM plato.Input1 WHERE subkey != "foo") AS b ON a.key = b.key
+WHERE a.key != "1" OR b.key != "2";
diff --git a/yt/yql/tests/sql/suites/join/from_in_front_join-off.cfg b/yt/yql/tests/sql/suites/join/from_in_front_join-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/from_in_front_join-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/from_in_front_join.cfg b/yt/yql/tests/sql/suites/join/from_in_front_join.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/from_in_front_join.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/from_in_front_join.sql b/yt/yql/tests/sql/suites/join/from_in_front_join.sql
new file mode 100644
index 0000000000..2e1c8489de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/from_in_front_join.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+from plato.Input1 inner join plato.Input3 using (key) select Input1.key, Input1.subkey, Input3.value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/full_equal_not_null-off.cfg b/yt/yql/tests/sql/suites/join/full_equal_not_null-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_not_null-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/full_equal_not_null.cfg b/yt/yql/tests/sql/suites/join/full_equal_not_null.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_not_null.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/full_equal_not_null.sql b/yt/yql/tests/sql/suites/join/full_equal_not_null.sql
new file mode 100644
index 0000000000..39de950979
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_not_null.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select count(*) from (select cast(subkey as int) as v1, subkey from plato.Input1) as a full join (select cast(subkey as int) as v2, subkey from plato.Input1) as b on a.v1 = b.v2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/full_equal_null-off.cfg b/yt/yql/tests/sql/suites/join/full_equal_null-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_null-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/full_equal_null.cfg b/yt/yql/tests/sql/suites/join/full_equal_null.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_null.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/full_equal_null.sql b/yt/yql/tests/sql/suites/join/full_equal_null.sql
new file mode 100644
index 0000000000..ed1d8077cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_equal_null.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select count(*) from (select cast(value as int) as v1, subkey from plato.Input1) as a full join (select cast(value as int) as v2, subkey from plato.Input1) as b on a.v1 = b.v2;
diff --git a/yt/yql/tests/sql/suites/join/full_join-off.cfg b/yt/yql/tests/sql/suites/join/full_join-off.cfg
new file mode 100644
index 0000000000..483714d007
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_join-off.cfg
@@ -0,0 +1,4 @@
+in test_join_1 test_join_1.txt
+in test_join_2 test_join_2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/full_join.cfg b/yt/yql/tests/sql/suites/join/full_join.cfg
new file mode 100644
index 0000000000..ec3dcd7a74
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_join.cfg
@@ -0,0 +1,2 @@
+in test_join_1 test_join_1.txt
+in test_join_2 test_join_2.txt
diff --git a/yt/yql/tests/sql/suites/join/full_join.sql b/yt/yql/tests/sql/suites/join/full_join.sql
new file mode 100644
index 0000000000..4f1e839311
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_join.sql
@@ -0,0 +1,19 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+SELECT
+ a.key AS a_key,
+ b.key AS b_key,
+ a.value AS a_value,
+ b.value AS b_value
+FROM
+ `test_join_1` AS a
+FULL JOIN
+ `test_join_2` AS b
+ON
+ a.key == b.subkey
+ORDER BY
+ b_key, a_key
+LIMIT 25
+;
+
diff --git a/yt/yql/tests/sql/suites/join/full_trivial-off.cfg b/yt/yql/tests/sql/suites/join/full_trivial-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/full_trivial.cfg b/yt/yql/tests/sql/suites/join/full_trivial.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/full_trivial.sql b/yt/yql/tests/sql/suites/join/full_trivial.sql
new file mode 100644
index 0000000000..bb6fa176f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial.sql
@@ -0,0 +1,5 @@
+PRAGMA DisableSimpleColumns;
+select coalesce(Input1.key, "_null") as a, coalesce(Input1.subkey, "_null") as b, coalesce(Input3.value, "_null") as c
+from plato.Input1
+full join plato.Input3 using (key)
+order by a, b, c; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/full_trivial_udf_call-off.cfg b/yt/yql/tests/sql/suites/join/full_trivial_udf_call-off.cfg
new file mode 100644
index 0000000000..2c2cb4cb8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial_udf_call-off.cfg
@@ -0,0 +1,7 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf simple_udf
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/full_trivial_udf_call.cfg b/yt/yql/tests/sql/suites/join/full_trivial_udf_call.cfg
new file mode 100644
index 0000000000..4d2ebba571
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial_udf_call.cfg
@@ -0,0 +1,5 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf simple_udf
diff --git a/yt/yql/tests/sql/suites/join/full_trivial_udf_call.sql b/yt/yql/tests/sql/suites/join/full_trivial_udf_call.sql
new file mode 100644
index 0000000000..d2acbd2b88
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/full_trivial_udf_call.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+select Input1.key, Input1.subkey, SimpleUdf::Concat(coalesce(Input1.value, ""), coalesce(Input3.value, "")) as value
+from plato.Input1
+full join plato.Input3 using (key)
+order by Input1.key, Input1.subkey, value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/gj_countries1.txt.attr b/yt/yql/tests/sql/suites/join/gj_countries1.txt.attr
new file mode 100644
index 0000000000..f9b5e0e010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/gj_countries1.txt.attr
@@ -0,0 +1,18 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "country_id";
+ "required" = %true;
+ "type" = "string"
+ };
+ {
+ "name" = "country_name";
+ "required" = %true;
+ "type" = "string"
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/gj_customers1.txt.attr b/yt/yql/tests/sql/suites/join/gj_customers1.txt.attr
new file mode 100644
index 0000000000..34f229c4fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/gj_customers1.txt.attr
@@ -0,0 +1,18 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "customer_id";
+ "required" = %true;
+ "type" = "string"
+ };
+ {
+ "name" = "country_id";
+ "required" = %true;
+ "type" = "string"
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/grace_join1-grace.cfg b/yt/yql/tests/sql/suites/join/grace_join1-grace.cfg
new file mode 100644
index 0000000000..11f6f5b18b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join1-grace.cfg
@@ -0,0 +1,4 @@
+in customers1 gj_customers1.txt
+in countries1 gj_countries1.txt
+providers dq
+pragma Dq.HashJoinMode='grace';
diff --git a/yt/yql/tests/sql/suites/join/grace_join1-map.cfg b/yt/yql/tests/sql/suites/join/grace_join1-map.cfg
new file mode 100644
index 0000000000..f787c0665b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join1-map.cfg
@@ -0,0 +1,4 @@
+in customers1 gj_customers1.txt
+in countries1 gj_countries1.txt
+providers dq
+pragma Dq.HashJoinMode='map';
diff --git a/yt/yql/tests/sql/suites/join/grace_join1-off.cfg b/yt/yql/tests/sql/suites/join/grace_join1-off.cfg
new file mode 100644
index 0000000000..5c48d49545
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join1-off.cfg
@@ -0,0 +1,5 @@
+in customers1 gj_customers1.txt
+in countries1 gj_countries1.txt
+providers dq
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/grace_join1.cfg b/yt/yql/tests/sql/suites/join/grace_join1.cfg
new file mode 100644
index 0000000000..a64c260418
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join1.cfg
@@ -0,0 +1,3 @@
+in customers1 gj_customers1.txt
+in countries1 gj_countries1.txt
+providers dq
diff --git a/yt/yql/tests/sql/suites/join/grace_join1.sql b/yt/yql/tests/sql/suites/join/grace_join1.sql
new file mode 100644
index 0000000000..42d4fdf492
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join1.sql
@@ -0,0 +1,11 @@
+USE plato;
+pragma DisableSimpleColumns;
+
+select
+cust.customer_id, cntr.country_name
+from
+plato.countries1 as cntr
+join
+plato.customers1 as cust
+on cntr.country_id = cust.country_id
+where cntr.country_id = "11";
diff --git a/yt/yql/tests/sql/suites/join/grace_join2.cfg b/yt/yql/tests/sql/suites/join/grace_join2.cfg
new file mode 100644
index 0000000000..7fa7de708f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join2.cfg
@@ -0,0 +1,3 @@
+in customers1 gj_customers1.txt
+providers dq
+pragma Dq.HashJoinMode='graceandself';
diff --git a/yt/yql/tests/sql/suites/join/grace_join2.sql b/yt/yql/tests/sql/suites/join/grace_join2.sql
new file mode 100644
index 0000000000..1b10d992e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/grace_join2.sql
@@ -0,0 +1,10 @@
+USE plato;
+pragma DisableSimpleColumns;
+
+select
+c1.customer_id, c2.customer_id
+from
+plato.customers1 as c1
+join
+plato.customers1 as c2
+on c1.country_id = c2.country_id order by c1.customer_id, c2.customer_id;
diff --git a/yt/yql/tests/sql/suites/join/group_compact_by.cfg b/yt/yql/tests/sql/suites/join/group_compact_by.cfg
new file mode 100644
index 0000000000..7697efeaa2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/group_compact_by.cfg
@@ -0,0 +1 @@
+in Input input8.txt
diff --git a/yt/yql/tests/sql/suites/join/group_compact_by.sql b/yt/yql/tests/sql/suites/join/group_compact_by.sql
new file mode 100644
index 0000000000..d5f33612df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/group_compact_by.sql
@@ -0,0 +1,14 @@
+USE plato;
+
+PRAGMA yt.JoinMergeForce = "1";
+pragma yt.JoinMergeTablesLimit="10";
+
+SELECT key1, subkey1
+FROM
+ (
+ SELECT a.key as key1, a.subkey as subkey1
+ FROM (SELECT * FROM Input WHERE subkey != "bar") AS a
+ JOIN (SELECT * FROM Input WHERE subkey != "foo") AS b
+ ON a.key = b.key AND a.subkey = b.subkey
+ )
+GROUP COMPACT BY key1, subkey1;
diff --git a/yt/yql/tests/sql/suites/join/inner_all-off.cfg b/yt/yql/tests/sql/suites/join/inner_all-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_all.cfg b/yt/yql/tests/sql/suites/join/inner_all.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_all.sql b/yt/yql/tests/sql/suites/join/inner_all.sql
new file mode 100644
index 0000000000..22803ca6b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+SELECT *
+FROM Input2 AS a
+JOIN Input3 AS b
+ON a.value == b.value;
diff --git a/yt/yql/tests/sql/suites/join/inner_all_right-off.cfg b/yt/yql/tests/sql/suites/join/inner_all_right-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all_right-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_all_right.cfg b/yt/yql/tests/sql/suites/join/inner_all_right.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all_right.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_all_right.sql b/yt/yql/tests/sql/suites/join/inner_all_right.sql
new file mode 100644
index 0000000000..ec84b11ad4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_all_right.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+SELECT b.*
+FROM Input2 AS a
+JOIN Input3 AS b
+ON a.value == b.value;
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped-off.cfg b/yt/yql/tests/sql/suites/join/inner_grouped-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped.cfg b/yt/yql/tests/sql/suites/join/inner_grouped.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped.sql b/yt/yql/tests/sql/suites/join/inner_grouped.sql
new file mode 100644
index 0000000000..14d580b119
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key as key, max(Input3.value) as value from plato.Input1 inner join plato.Input3 using (key) group by Input1.key order by key;
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped_by_expr-off.cfg b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.cfg b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.sql b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.sql
new file mode 100644
index 0000000000..97f05fef2d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_grouped_by_expr.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+select keyz, max(Input3.value) as value from plato.Input1 inner join plato.Input3 using (key) group by Input1.key as keyz order by keyz;
diff --git a/yt/yql/tests/sql/suites/join/inner_on_key_only-off.cfg b/yt/yql/tests/sql/suites/join/inner_on_key_only-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_on_key_only-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_on_key_only.cfg b/yt/yql/tests/sql/suites/join/inner_on_key_only.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_on_key_only.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_on_key_only.sql b/yt/yql/tests/sql/suites/join/inner_on_key_only.sql
new file mode 100644
index 0000000000..e2d7e57d63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_on_key_only.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key, Input1.subkey, Input3.value from plato.Input1 inner join plato.Input3 on Input1.key = Input3.key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/inner_table_and_view.cfg b/yt/yql/tests/sql/suites/join/inner_table_and_view.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_table_and_view.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial-off.cfg b/yt/yql/tests/sql/suites/join/inner_trivial-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial.cfg b/yt/yql/tests/sql/suites/join/inner_trivial.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial.sql b/yt/yql/tests/sql/suites/join/inner_trivial.sql
new file mode 100644
index 0000000000..19db34045c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key, Input1.subkey, Input3.value from plato.Input1 inner join plato.Input3 using (key); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial_from_concat-off.cfg b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.cfg b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.sql b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.sql
new file mode 100644
index 0000000000..aa317b9784
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_trivial_from_concat.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+select A.key, A.subkey, B.value from plato.concat(Input1, Input2) as A inner join plato.Input3 as B using (key); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/inner_with_order-off.cfg b/yt/yql/tests/sql/suites/join/inner_with_order-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_order-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_with_order.cfg b/yt/yql/tests/sql/suites/join/inner_with_order.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_order.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_with_order.sql b/yt/yql/tests/sql/suites/join/inner_with_order.sql
new file mode 100644
index 0000000000..471fb485ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_order.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key as key, Input1.subkey, Input3.value from plato.Input1 inner join plato.Input3 using (key) order by key desc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/inner_with_select-off.cfg b/yt/yql/tests/sql/suites/join/inner_with_select-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_select-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/inner_with_select.cfg b/yt/yql/tests/sql/suites/join/inner_with_select.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_select.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/inner_with_select.sql b/yt/yql/tests/sql/suites/join/inner_with_select.sql
new file mode 100644
index 0000000000..b1e0c35edd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/inner_with_select.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+select
+ Input1.key as key,
+ Input1.subkey as subkey,
+ selected.value as value
+from plato.Input1
+inner join (select key, value || value as value from plato.Input3) as selected
+ using (key)
+order by key desc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/input6.txt.attr b/yt/yql/tests/sql/suites/join/input6.txt.attr
new file mode 100644
index 0000000000..ad1624a955
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/input6.txt.attr
@@ -0,0 +1,9 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key1";["DataType";"Utf8"]];
+ ["subkey1";["DataType";"Utf8"]];
+ ["key";["DataType";"Utf8"]];
+ ["subkey";["DataType";"Utf8"]];
+ ["value";["DataType";"Utf8"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/join/input8.txt.attr b/yt/yql/tests/sql/suites/join/input8.txt.attr
new file mode 100644
index 0000000000..7ec3f318dc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/input8.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]]
+ ];
+ "SortDirections"=[1;1];
+ "SortedBy"=["key";"subkey"];
+ "SortedByTypes"=[["DataType";"String"];["DataType";"String"]];
+ "SortMembers"=["key";"subkey"];
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/input9.txt.attr b/yt/yql/tests/sql/suites/join/input9.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/input9.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/join/input_left.txt.attr b/yt/yql/tests/sql/suites/join/input_left.txt.attr
new file mode 100644
index 0000000000..58ca2c84ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/input_left.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k";["DataType";"Uint64"]];
+ ["sk";["DataType";"Utf8"]];
+ ["v";["DataType";"Utf8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/join/input_right.txt.attr b/yt/yql/tests/sql/suites/join/input_right.txt.attr
new file mode 100644
index 0000000000..58ca2c84ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/input_right.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k";["DataType";"Uint64"]];
+ ["sk";["DataType";"Utf8"]];
+ ["v";["DataType";"Utf8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/join/join_and_distinct_key-off.cfg b/yt/yql/tests/sql/suites/join/join_and_distinct_key-off.cfg
new file mode 100644
index 0000000000..76a2a2b6a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_and_distinct_key-off.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_and_distinct_key.cfg b/yt/yql/tests/sql/suites/join/join_and_distinct_key.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_and_distinct_key.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/join/join_and_distinct_key.sql b/yt/yql/tests/sql/suites/join/join_and_distinct_key.sql
new file mode 100644
index 0000000000..08037b8f7d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_and_distinct_key.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT
+ count(i1.key) as count,
+ count(distinct i1.key) as uniq_count
+FROM plato.Input as i1 JOIN plato.Input AS i2 on cast(i1.key as uint32) / 100 == cast(i2.subkey as uint32) / 100
+;
diff --git a/yt/yql/tests/sql/suites/join/join_cbo_3_tables.cfg b/yt/yql/tests/sql/suites/join/join_cbo_3_tables.cfg
new file mode 100644
index 0000000000..6978b80cd9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_cbo_3_tables.cfg
@@ -0,0 +1,4 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_cbo_3_tables.sql b/yt/yql/tests/sql/suites/join/join_cbo_3_tables.sql
new file mode 100644
index 0000000000..b848360746
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_cbo_3_tables.sql
@@ -0,0 +1,11 @@
+use plato;
+pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS
+
+pragma CostBasedOptimizer="pg";
+
+select i1.value, i2.value, i3.value, i4.value
+from Input1 as i1
+join Input2 as i2 on i1.key=i2.key
+join Input3 as i3 on i1.key=i3.key
+join Input4 as i4 on i1.key=i4.key
+order by i1.value, i2.value, i3.value, i4.value;
diff --git a/yt/yql/tests/sql/suites/join/join_comp_common_table-off.cfg b/yt/yql/tests/sql/suites/join/join_comp_common_table-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_common_table-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_comp_common_table.cfg b/yt/yql/tests/sql/suites/join/join_comp_common_table.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_common_table.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_comp_common_table.sql b/yt/yql/tests/sql/suites/join/join_comp_common_table.sql
new file mode 100644
index 0000000000..770d18ecd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_common_table.sql
@@ -0,0 +1,15 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+use plato;
+
+$i = (select AsList(key) as x from Input);
+$j = (select Just(AsList(key)) as y from Input);
+select a.x as zzz,b.y as fff from $i as a inner join $j as b on a.x = b.y order by zzz,fff;
+select a.x as zzz,b.y as fff from $i as a right join $j as b on a.x = b.y order by zzz,fff;
+select a.x as zzz,b.y as fff from $i as a left join $j as b on a.x = b.y order by zzz,fff;
+select a.x as zzz from $i as a left semi join $j as b on a.x = b.y order by zzz;
+select a.x as zzz from $i as a left only join $j as b on a.x = b.y order by zzz;
+select b.y as fff from $i as a right semi join $j as b on a.x = b.y order by fff;
+select b.y as fff from $i as a right only join $j as b on a.x = b.y order by fff;
+select a.x as zzz,b.y as fff from $i as a full join $j as b on a.x = b.y order by zzz,fff;
+select a.x as zzz,b.y as fff from $i as a exclusion join $j as b on a.x = b.y order by zzz,fff;
diff --git a/yt/yql/tests/sql/suites/join/join_comp_map_table-off.cfg b/yt/yql/tests/sql/suites/join/join_comp_map_table-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_map_table-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_comp_map_table.cfg b/yt/yql/tests/sql/suites/join/join_comp_map_table.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_map_table.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_comp_map_table.sql b/yt/yql/tests/sql/suites/join/join_comp_map_table.sql
new file mode 100644
index 0000000000..4f64d5e685
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_comp_map_table.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+pragma yt.MapJoinLimit="1m";
+use plato;
+
+$i = (select AsList(key) as x from Input);
+$j = (select Just(AsList(key)) as y from Input);
+select a.x as zzz,b.y as fff from $i as a inner join $j as b on a.x = b.y;
+select a.x as zzz,b.y as fff from $i as a right join $j as b on a.x = b.y;
+select a.x as zzz,b.y as fff from $i as a left join $j as b on a.x = b.y;
+select a.x as zzz from $i as a left semi join $j as b on a.x = b.y;
+select a.x as zzz from $i as a left only join $j as b on a.x = b.y;
+select b.y as fff from $i as a right semi join $j as b on a.x = b.y;
+select b.y as fff from $i as a right only join $j as b on a.x = b.y;
diff --git a/yt/yql/tests/sql/suites/join/join_key_cmp_udf-off.cfg b/yt/yql/tests/sql/suites/join/join_key_cmp_udf-off.cfg
new file mode 100644
index 0000000000..3892ddff67
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_key_cmp_udf-off.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+udf string_udf
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_key_cmp_udf.cfg b/yt/yql/tests/sql/suites/join/join_key_cmp_udf.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_key_cmp_udf.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/join/join_key_cmp_udf.sql b/yt/yql/tests/sql/suites/join/join_key_cmp_udf.sql
new file mode 100644
index 0000000000..70a160e96d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_key_cmp_udf.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ ib.*
+FROM Input as ia
+JOIN Input as ib
+ON Unicode::ToUpper(CAST(ia.key AS Utf8)) == ib.subkey
+ORDER BY ib.key, ib.subkey
diff --git a/yt/yql/tests/sql/suites/join/join_left_cbo.cfg b/yt/yql/tests/sql/suites/join/join_left_cbo.cfg
new file mode 100644
index 0000000000..559fde513f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_left_cbo.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+in Input2 input2.txt
diff --git a/yt/yql/tests/sql/suites/join/join_left_cbo.sql b/yt/yql/tests/sql/suites/join/join_left_cbo.sql
new file mode 100644
index 0000000000..d3f698da2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_left_cbo.sql
@@ -0,0 +1,9 @@
+use plato;
+pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS
+
+pragma CostBasedOptimizer="PG";
+
+select i1.value, i2.value
+from Input1 as i1
+left join Input2 as i2 on i1.key=i2.key
+order by i1.value, i2.value;
diff --git a/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by-off.cfg b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.cfg b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.sql b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.sql
new file mode 100644
index 0000000000..1f3f1f4d95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_no_correlation_in_order_by.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 > 3);
+
+--INSERT INTO Output
+SELECT
+ *
+FROM Input JOIN $data as d ON Input.subkey = d.kk
+ORDER BY key, val
+;
diff --git a/yt/yql/tests/sql/suites/join/join_right_cbo.cfg b/yt/yql/tests/sql/suites/join/join_right_cbo.cfg
new file mode 100644
index 0000000000..559fde513f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_right_cbo.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+in Input2 input2.txt
diff --git a/yt/yql/tests/sql/suites/join/join_right_cbo.sql b/yt/yql/tests/sql/suites/join/join_right_cbo.sql
new file mode 100644
index 0000000000..99ed74da72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_right_cbo.sql
@@ -0,0 +1,9 @@
+use plato;
+pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS
+
+pragma CostBasedOptimizer="PG";
+
+select i1.value, i2.value
+from Input1 as i1
+right join Input2 as i2 on i1.key=i2.key
+order by i1.value, i2.value;
diff --git a/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by-off.cfg b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.cfg b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.sql b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.sql
new file mode 100644
index 0000000000..4065705a77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_semi_correlation_in_order_by.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 > 3);
+
+--INSERT INTO Output
+SELECT
+ *
+FROM Input JOIN $data as d ON Input.subkey = d.kk
+ORDER BY key, d.val
+;
diff --git a/yt/yql/tests/sql/suites/join/join_table_conflict_fail.cfg b/yt/yql/tests/sql/suites/join/join_table_conflict_fail.cfg
new file mode 100644
index 0000000000..9217c920f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_table_conflict_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/join_table_conflict_fail.sql b/yt/yql/tests/sql/suites/join/join_table_conflict_fail.sql
new file mode 100644
index 0000000000..45fb1781a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_table_conflict_fail.sql
@@ -0,0 +1,11 @@
+/* custom error:column name: value conflicted without correlation name it may be one of: Input.value, d.value*/
+PRAGMA DisableSimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value || value as value FROM Input WHERE cast(key as uint32)/100 > 3);
+
+--INSERT INTO Output
+SELECT
+ value, key -- value is conflicted between Input and d sources
+FROM Input JOIN $data as d ON Input.subkey = d.kk
+;
diff --git a/yt/yql/tests/sql/suites/join/join_with_dot_without_alias.cfg b/yt/yql/tests/sql/suites/join/join_with_dot_without_alias.cfg
new file mode 100644
index 0000000000..702bbb5a52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_with_dot_without_alias.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input.with.dot input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted-off.cfg b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted-off.cfg
new file mode 100644
index 0000000000..49af2b95f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted-off.cfg
@@ -0,0 +1,4 @@
+in SortedByKey sorted_by_key1.txt
+in SortedByKeySubkey sorted_by_key_subkey.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.cfg b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.cfg
new file mode 100644
index 0000000000..464068db6a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.cfg
@@ -0,0 +1,2 @@
+in SortedByKey sorted_by_key1.txt
+in SortedByKeySubkey sorted_by_key_subkey.txt
diff --git a/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.sql b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.sql
new file mode 100644
index 0000000000..9b350d29a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_with_duplicate_keys_on_sorted.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+
+FROM SortedByKeySubkey AS a JOIN SortedByKey AS b ON a.key=b.key AND a.subkey=b.key
+SELECT * ORDER BY a.value, b.value;
diff --git a/yt/yql/tests/sql/suites/join/join_without_column-off.cfg b/yt/yql/tests/sql/suites/join/join_without_column-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_column-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_without_column.cfg b/yt/yql/tests/sql/suites/join/join_without_column.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_column.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/join_without_column.sql b/yt/yql/tests/sql/suites/join/join_without_column.sql
new file mode 100644
index 0000000000..4c9c4bd612
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_column.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ *
+WITHOUT
+ d.value
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key
+;
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access-off.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access-off.cfg
new file mode 100644
index 0000000000..76a2a2b6a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access-off.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.sql b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.sql
new file mode 100644
index 0000000000..280a971538
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_dict_access.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+use plato;
+
+$data_dict = (select
+ mod,
+ YQL::ToIndexDict(ListSort(aggregate_list(key))) as dk,
+ ListSort(aggregate_list(subkey)) as ls,
+ ListSort(aggregate_list(value)) as lv
+from Input
+group by cast(key as uint32) % 10 as mod);
+
+--INSERT INTO Output
+SELECT
+--DISTINCT
+ dk[2],
+ key,
+ value
+FROM Input JOIN $data_dict AS d on cast(Input.key as uint32) / 100 == d.mod
+order by key, value
+;
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access-off.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access-off.cfg
new file mode 100644
index 0000000000..76a2a2b6a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access-off.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.sql b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.sql
new file mode 100644
index 0000000000..d1934f0bfc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_and_struct_access.sql
@@ -0,0 +1,18 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+use plato;
+
+$data = ( select
+ cast(key as uint32) % 10 as mod,
+ (key as kk, subkey as sk) as struct_field
+from Input);
+
+--INSERT INTO Output
+SELECT
+ mod,
+ struct_field.kk as mod_key,
+ key,
+ value
+FROM Input JOIN $data AS d on cast(Input.key as uint32) / 100 == d.mod
+order by key, mod_key, value
+;
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_names-off.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_names-off.cfg
new file mode 100644
index 0000000000..76a2a2b6a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_names-off.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_names.cfg b/yt/yql/tests/sql/suites/join/join_without_correlation_names.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_names.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/join/join_without_correlation_names.sql b/yt/yql/tests/sql/suites/join/join_without_correlation_names.sql
new file mode 100644
index 0000000000..98922c13e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/join_without_correlation_names.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 > 3);
+
+--INSERT INTO Output
+SELECT
+ value, val, key, sk
+FROM Input JOIN $data as d ON Input.subkey = d.kk
+ORDER BY value, val;
diff --git a/yt/yql/tests/sql/suites/join/kv1_sorted.txt.attr b/yt/yql/tests/sql/suites/join/kv1_sorted.txt.attr
new file mode 100644
index 0000000000..0b9487ba64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv1_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv1_sorted1.txt.attr b/yt/yql/tests/sql/suites/join/kv1_sorted1.txt.attr
new file mode 100644
index 0000000000..0b9487ba64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv1_sorted1.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv2_sorted.txt.attr b/yt/yql/tests/sql/suites/join/kv2_sorted.txt.attr
new file mode 100644
index 0000000000..387ceb1b55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv2_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv2_sorted1.txt.attr b/yt/yql/tests/sql/suites/join/kv2_sorted1.txt.attr
new file mode 100644
index 0000000000..387ceb1b55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv2_sorted1.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv3_sorted.txt.attr b/yt/yql/tests/sql/suites/join/kv3_sorted.txt.attr
new file mode 100644
index 0000000000..90e6a79548
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv3_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k3";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v3";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u3";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv4_sorted.txt.attr b/yt/yql/tests/sql/suites/join/kv4_sorted.txt.attr
new file mode 100644
index 0000000000..ea731dd20b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv4_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %true
+ >
+ [
+ {
+ "name" = "k4";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v4";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u4";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/kv5_sorted.txt.attr b/yt/yql/tests/sql/suites/join/kv5_sorted.txt.attr
new file mode 100644
index 0000000000..05a419bcca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/kv5_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k5";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v5";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u5";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.cfg b/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.cfg
new file mode 100644
index 0000000000..04719e2ed1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.sql b/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.sql
new file mode 100644
index 0000000000..b0dd13c10d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/late_mergejoin_on_empty.sql
@@ -0,0 +1,8 @@
+use plato;
+PRAGMA DisableSimpleColumns;
+pragma yt.JoinMergeTablesLimit="100";
+
+select * from
+(select * from Input where key < "020") as a
+left only join (select subkey from Input where key < "010") as b on a.subkey = b.subkey
+join /*+ merge() */ (select key, value from Input) as c on a.key = c.key
diff --git a/yt/yql/tests/sql/suites/join/leaf.txt.attr b/yt/yql/tests/sql/suites/join/leaf.txt.attr
new file mode 100644
index 0000000000..0a764a6b82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/leaf.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["value";["OptionalType";["DataType";"String"]]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/join/left_all-off.cfg b/yt/yql/tests/sql/suites/join/left_all-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_all-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_all.cfg b/yt/yql/tests/sql/suites/join/left_all.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_all.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_all.sql b/yt/yql/tests/sql/suites/join/left_all.sql
new file mode 100644
index 0000000000..b980bc85d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_all.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+SELECT *
+FROM Input2 AS a
+LEFT JOIN Input3 AS b
+ON a.value == b.value;
diff --git a/yt/yql/tests/sql/suites/join/left_cast_to_string-off.cfg b/yt/yql/tests/sql/suites/join/left_cast_to_string-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_cast_to_string-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_cast_to_string.cfg b/yt/yql/tests/sql/suites/join/left_cast_to_string.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_cast_to_string.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_cast_to_string.sql b/yt/yql/tests/sql/suites/join/left_cast_to_string.sql
new file mode 100644
index 0000000000..5d41a78255
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_cast_to_string.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key as key, Input1.subkey, Cast(Input3.value as varchar) as value from plato.Input1 left join plato.Input3 using (key) order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/left_join_input1.txt.attr b/yt/yql/tests/sql/suites/join/left_join_input1.txt.attr
new file mode 100644
index 0000000000..4f113053bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_input1.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["Key1";["OptionalType";["DataType";"Int32"]]];
+ ["Key2";["OptionalType";["DataType";"String"]]];
+ ["Fk1";["OptionalType";["DataType";"String"]]];
+ ["Value";["OptionalType";["DataType";"String"]]]]
+ ];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/join/left_join_input2.txt.attr b/yt/yql/tests/sql/suites/join/left_join_input2.txt.attr
new file mode 100644
index 0000000000..be5e16e2ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_input2.txt.attr
@@ -0,0 +1,8 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["Key";["DataType";"String"]];
+ ["Value";["OptionalType";["DataType";"Int32"]]]]
+ ];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/join/left_join_input3.txt.attr b/yt/yql/tests/sql/suites/join/left_join_input3.txt.attr
new file mode 100644
index 0000000000..be5e16e2ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_input3.txt.attr
@@ -0,0 +1,8 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["Key";["DataType";"String"]];
+ ["Value";["OptionalType";["DataType";"Int32"]]]]
+ ];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/join/left_join_null_column-off.cfg b/yt/yql/tests/sql/suites/join/left_join_null_column-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_null_column-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_join_null_column.cfg b/yt/yql/tests/sql/suites/join/left_join_null_column.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_null_column.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_null_column.sql b/yt/yql/tests/sql/suites/join/left_join_null_column.sql
new file mode 100644
index 0000000000..c7e38d6e0c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_null_column.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"x":"150", "y":1, "z":Null|>, <|"x":"150", "y":2, "z":Null|>];
+
+SELECT * FROM Input1 AS a LEFT JOIN AS_TABLE($t) AS b ON a.key = b.x ORDER BY key, y;
+
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.cfg b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.cfg
new file mode 100644
index 0000000000..a0d2d24b7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.cfg
@@ -0,0 +1,3 @@
+in Input1 left_join_input1.txt
+in Input2 left_join_input2.txt
+in Input3 left_join_input3.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.sql b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.sql
new file mode 100644
index 0000000000..da815ce13b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_left.sql
@@ -0,0 +1,11 @@
+PRAGMA FilterPushdownOverJoinOptionalSide;
+
+SELECT t1.Key1, t1.Key2, t1.Fk1, t1.Value, t2.Key, t2.Value, t3.Value
+
+FROM plato.Input1 AS t1
+LEFT JOIN plato.Input2 AS t2
+ON t1.Fk1 = t2.Key
+INNER JOIN plato.Input3 as t3
+ON t1.Fk1 = t3.Key
+
+WHERE t2.Value > 1001;
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.cfg b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.cfg
new file mode 100644
index 0000000000..a0d2d24b7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.cfg
@@ -0,0 +1,3 @@
+in Input1 left_join_input1.txt
+in Input2 left_join_input2.txt
+in Input3 left_join_input3.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.sql b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.sql
new file mode 100644
index 0000000000..fe7fdeea48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_nested_right.sql
@@ -0,0 +1,10 @@
+PRAGMA FilterPushdownOverJoinOptionalSide;
+
+SELECT t1.Key1, t1.Key2, t1.Fk1, t1.Value, t2.Key, t2.Value, t3.Value
+
+FROM plato.Input1 AS t1
+CROSS JOIN plato.Input3 AS t3
+LEFT JOIN plato.Input2 AS t2
+ON t1.Fk1 = t2.Key
+
+WHERE t2.Value > 1001;
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.cfg b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.cfg
new file mode 100644
index 0000000000..a0d2d24b7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.cfg
@@ -0,0 +1,3 @@
+in Input1 left_join_input1.txt
+in Input2 left_join_input2.txt
+in Input3 left_join_input3.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.sql b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.sql
new file mode 100644
index 0000000000..de596ae77b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_no_opt.sql
@@ -0,0 +1,7 @@
+PRAGMA FilterPushdownOverJoinOptionalSide;
+
+SELECT t1.Key1, t1.Key2, t1.Fk1, t1.Value, t2.Key, t2.Value FROM plato.Input2 AS t2
+RIGHT JOIN plato.Input1 AS t1
+ON t2.Key = t1.Fk1
+WHERE t1.Key1 > 104
+ORDER BY t1.Key1, t1.Key2;
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.cfg b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.cfg
new file mode 100644
index 0000000000..a0d2d24b7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.cfg
@@ -0,0 +1,3 @@
+in Input1 left_join_input1.txt
+in Input2 left_join_input2.txt
+in Input3 left_join_input3.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.sql b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.sql
new file mode 100644
index 0000000000..ec45c754b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_null.sql
@@ -0,0 +1,7 @@
+PRAGMA FilterPushdownOverJoinOptionalSide;
+
+SELECT t1.Key1, t1.Key2, t1.Fk1, t1.Value, t2.Key, t2.Value FROM plato.Input1 AS t1
+LEFT JOIN plato.Input2 AS t2
+ON t1.Fk1 = t2.Key
+WHERE t2.Value IS NULL
+ORDER BY t1.Key1, t1.Key2;
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.cfg b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.sql b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.sql
new file mode 100644
index 0000000000..e1c15a8d52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_join_right_pushdown_simple.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA FilterPushdownOverJoinOptionalSide;
+
+use plato;
+SELECT *
+FROM Input2 AS a
+LEFT JOIN Input3 AS b
+ON a.value == b.value
+WHERE b.value >= "ddd";
diff --git a/yt/yql/tests/sql/suites/join/left_null_literal-off.cfg b/yt/yql/tests/sql/suites/join/left_null_literal-off.cfg
new file mode 100644
index 0000000000..a838c2cc3a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_null_literal-off.cfg
@@ -0,0 +1,3 @@
+out Output output.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_null_literal.cfg b/yt/yql/tests/sql/suites/join/left_null_literal.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_null_literal.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/join/left_null_literal.sql b/yt/yql/tests/sql/suites/join/left_null_literal.sql
new file mode 100644
index 0000000000..4325869895
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_null_literal.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+use plato;
+
+$foo = [<|"x":1|>];
+$bar = [<|"x":1, "y":Null|>];
+
+insert into Output
+select * from AS_TABLE($foo) as a LEFT JOIN AS_TABLE($bar) as b USING(x);
diff --git a/yt/yql/tests/sql/suites/join/left_only_semi_and_other-off.cfg b/yt/yql/tests/sql/suites/join/left_only_semi_and_other-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_semi_and_other-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_only_semi_and_other.cfg b/yt/yql/tests/sql/suites/join/left_only_semi_and_other.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_semi_and_other.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_only_semi_and_other.sql b/yt/yql/tests/sql/suites/join/left_only_semi_and_other.sql
new file mode 100644
index 0000000000..3258c30324
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_semi_and_other.sql
@@ -0,0 +1,15 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data1 = (select cast(key as uint32) as key, subkey, value from Input1);
+$data2 = (select cast(key as uint32) % 100u as key, subkey, value from Input3);
+
+--INSERT INTO Output
+SELECT
+ i1.*
+FROM $data1 as i1
+LEFT ONLY JOIN $data2 as i2 ON i1.key = i2.key
+LEFT SEMI JOIN $data1 as i3 ON i1.key = i3.key
+LEFT OUTER JOIN $data1 as i4 ON i1.key = i4.key
+ORDER BY i1.key
diff --git a/yt/yql/tests/sql/suites/join/left_only_with_other-off.cfg b/yt/yql/tests/sql/suites/join/left_only_with_other-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_with_other-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_only_with_other.cfg b/yt/yql/tests/sql/suites/join/left_only_with_other.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_with_other.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_only_with_other.sql b/yt/yql/tests/sql/suites/join/left_only_with_other.sql
new file mode 100644
index 0000000000..65b1bf178d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_only_with_other.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data1 = (select cast(key as uint32) as key, subkey, value from Input1);
+$data2 = (select cast(key as uint32) % 100u as key, subkey, value from Input1);
+
+--INSERT INTO Output
+SELECT
+ i1.*
+FROM $data1 as i1
+LEFT ONLY JOIN $data2 as i2 ON i1.key = i2.key
+JOIN $data1 as i3 ON i1.key = i3.key
+;
diff --git a/yt/yql/tests/sql/suites/join/left_semi_with_other-off.cfg b/yt/yql/tests/sql/suites/join/left_semi_with_other-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_semi_with_other-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_semi_with_other.cfg b/yt/yql/tests/sql/suites/join/left_semi_with_other.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_semi_with_other.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_semi_with_other.sql b/yt/yql/tests/sql/suites/join/left_semi_with_other.sql
new file mode 100644
index 0000000000..0ac01a9e53
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_semi_with_other.sql
@@ -0,0 +1,15 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+$data1 = (select cast(key as uint32) as key, subkey, value from Input1);
+$data2 = (select cast(key as uint32) % 100u as key, subkey, value from Input2);
+
+--INSERT INTO Output
+SELECT
+ i1.*
+FROM $data1 as i1
+LEFT SEMI JOIN $data2 as i2 ON i1.key = i2.key
+LEFT OUTER JOIN $data1 as i3 ON i1.key = i3.key
+ORDER BY i1.key
+;
diff --git a/yt/yql/tests/sql/suites/join/left_trivial-off.cfg b/yt/yql/tests/sql/suites/join/left_trivial-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_trivial-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/left_trivial.cfg b/yt/yql/tests/sql/suites/join/left_trivial.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_trivial.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/left_trivial.sql b/yt/yql/tests/sql/suites/join/left_trivial.sql
new file mode 100644
index 0000000000..ae448327da
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/left_trivial.sql
@@ -0,0 +1,5 @@
+PRAGMA DisableSimpleColumns;
+select Input1.key, Input1.subkey, Input3.value
+from plato.Input1
+left join plato.Input3 using (key)
+order by Input1.key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.sql b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.sql
new file mode 100644
index 0000000000..63d400bf94
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_csee.sql
@@ -0,0 +1,30 @@
+/* ignore runonopt plan diff */
+USE plato;
+PRAGMA DisableSimpleColumns;
+PRAGMA yt.LookupJoinLimit="64k";
+PRAGMA yt.LookupJoinMaxRows="100";
+
+$campaigns_data = AsList(
+ AsStruct(Just(1) as id),
+ AsStruct(Just(2) as id));
+
+$strategies_data = AsList(
+ AsStruct(Just(1) as id),
+ AsStruct(Just(2) as id));
+
+$lottery_data = AsList(
+ AsStruct(Just(1) as id, Just(2) as campaign_id, Just(3) as strategy_id));
+
+
+INSERT INTO @campaigns SELECT * FROM AS_TABLE($campaigns_data) ORDER BY id;
+INSERT INTO @strategies SELECT * FROM AS_TABLE($strategies_data) ORDER BY id;
+INSERT INTO @lottery SELECT * FROM AS_TABLE($lottery_data) ORDER BY id;
+
+COMMIT;
+
+SELECT
+ lottery.id AS lottery_id
+FROM @lottery AS lottery
+ JOIN @campaigns AS campaigns ON lottery.campaign_id = campaigns.id
+ JOIN @strategies AS strategies ON lottery.strategy_id = strategies.id
+WHERE 1 < 0
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.sql b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.sql
new file mode 100644
index 0000000000..e91ef8f7c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug7646_subst.sql
@@ -0,0 +1,28 @@
+USE plato;
+PRAGMA DisableSimpleColumns;
+PRAGMA yt.LookupJoinLimit="64k";
+PRAGMA yt.LookupJoinMaxRows="100";
+
+$campaigns_data = AsList(
+ AsStruct(Just(1) as id),
+ AsStruct(Just(2) as id));
+
+$strategies_data = AsList(
+ AsStruct(Just(1) as id),
+ AsStruct(Just(2) as id));
+
+$lottery_data = AsList(
+ AsStruct(Just(1) as id, Just(2) as campaign_id, Just(3) as strategy_id));
+
+
+INSERT INTO @campaigns SELECT * FROM AS_TABLE($campaigns_data) ORDER BY id;
+INSERT INTO @strategies SELECT * FROM AS_TABLE($strategies_data) ORDER BY id;
+INSERT INTO @lottery SELECT * FROM AS_TABLE($lottery_data) ORDER BY id;
+
+COMMIT;
+
+SELECT
+ lottery.id AS lottery_id
+FROM @lottery AS lottery
+ JOIN @campaigns AS campaigns ON lottery.campaign_id = campaigns.id
+ JOIN @strategies AS strategies ON lottery.strategy_id = strategies.id
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug8533-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.sql b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.sql
new file mode 100644
index 0000000000..8e2b401fa0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_bug8533.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- tables should be swapped (Input1 is bigger)
+select * from Input2 as a
+inner join any Input1 as b on a.k2 = b.k1;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner.sql b/yt/yql/tests/sql/suites/join/lookupjoin_inner.sql
new file mode 100644
index 0000000000..a85dec245c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- tables should be swapped (Input1 is bigger)
+select * from Input2 as a
+inner join Input1 as b on a.k2 = b.k1 and a.v2 = b.v1;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o-off.cfg
new file mode 100644
index 0000000000..473c367b92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.cfg
new file mode 100644
index 0000000000..0e1c5e12b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.sql
new file mode 100644
index 0000000000..a85dec245c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- tables should be swapped (Input1 is bigger)
+select * from Input2 as a
+inner join Input1 as b on a.k2 = b.k1 and a.v2 = b.v1;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o-off.cfg
new file mode 100644
index 0000000000..cb6cc9dbbf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2_opt.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.cfg
new file mode 100644
index 0000000000..a567b5178d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2_opt.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.sql
new file mode 100644
index 0000000000..a85dec245c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_1o2o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- tables should be swapped (Input1 is bigger)
+select * from Input2 as a
+inner join Input1 as b on a.k2 = b.k1 and a.v2 = b.v1;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o-off.cfg
new file mode 100644
index 0000000000..8dc359be1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_opt.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.cfg
new file mode 100644
index 0000000000..a636052ccc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_opt.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.sql
new file mode 100644
index 0000000000..a85dec245c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_2o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- tables should be swapped (Input1 is bigger)
+select * from Input2 as a
+inner join Input1 as b on a.k2 = b.k1 and a.v2 = b.v1;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.sql b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.sql
new file mode 100644
index 0000000000..afbfb0757b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_inner_empty_subq.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+select * from Input1 as a
+inner join (select * from Input2 where k2 = "not_existent") as b on a.k1 = b.k2;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_not_selected-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.sql b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.sql
new file mode 100644
index 0000000000..1f0f03b410
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_not_selected.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- no lookup join in this case
+select * from Input1 as a
+left join Input2 as b on a.k1 = b.k2;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi.sql
new file mode 100644
index 0000000000..79093ae0fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o-off.cfg
new file mode 100644
index 0000000000..473c367b92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.cfg
new file mode 100644
index 0000000000..0e1c5e12b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.sql
new file mode 100644
index 0000000000..79093ae0fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o-off.cfg
new file mode 100644
index 0000000000..cb6cc9dbbf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2_opt.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.cfg
new file mode 100644
index 0000000000..a567b5178d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_opt.txt
+in Input2 sorted_by_kv2_opt.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.sql
new file mode 100644
index 0000000000..79093ae0fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_1o2o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o-off.cfg
new file mode 100644
index 0000000000..8dc359be1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_opt.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.cfg
new file mode 100644
index 0000000000..a636052ccc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_opt.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.sql
new file mode 100644
index 0000000000..79093ae0fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_2o.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty-off.cfg
new file mode 100644
index 0000000000..29c54dddd7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_empty.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.cfg
new file mode 100644
index 0000000000..b8938b393e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2_empty.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.sql
new file mode 100644
index 0000000000..79093ae0fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_empty.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.sql b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.sql
new file mode 100644
index 0000000000..96cb5ca79a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_semi_subq.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+-- prefix of sort keys
+select * from Input1 as a
+left semi join (select * from Input2 where k2 != "ccc") as b on a.k1 = b.k2
+order by a.k1;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.cfg
new file mode 100644
index 0000000000..8790d17dc7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.cfg
@@ -0,0 +1,2 @@
+in Input input9.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.sql b/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.sql
new file mode 100644
index 0000000000..de1195209c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_take_skip.sql
@@ -0,0 +1,12 @@
+USE plato;
+PRAGMA yt.LookupJoinMaxRows="3";
+pragma yt.LookupJoinLimit = '10M';
+
+insert into @big
+select * from (select ListMap(ListFromRange(1, 100), ($x)->(Unwrap(CAST($x as String)))) as key) flatten list by key order by key;
+commit;
+
+$small = select substring(key, 0, 2) as key, subkey || '000' as subkey from Input order by key limit 5 offset 8;
+
+select * from @big as a join $small as b using(key) order by key;
+
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.sql
new file mode 100644
index 0000000000..cd0840eefe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_unused_keys.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+use plato;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+
+select
+
+v3
+
+from Input1 as a
+join Input2 as b on (a.k1 = b.k2)
+join Input3 as c on (a.k1 = c.k3)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_with_cache-off.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache-off.cfg
new file mode 100644
index 0000000000..e7286dfd15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache-off.cfg
@@ -0,0 +1,3 @@
+in Input sorted_by_key_subkey.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.cfg b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.cfg
new file mode 100644
index 0000000000..2e90092760
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.cfg
@@ -0,0 +1 @@
+in Input sorted_by_key_subkey.txt
diff --git a/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.sql b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.sql
new file mode 100644
index 0000000000..0aeadca09a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/lookupjoin_with_cache.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* kikimr can not */
+use plato;
+PRAGMA DisableSimpleColumns;
+pragma yt.LookupJoinLimit="64k";
+pragma yt.LookupJoinMaxRows="100";
+pragma yt.QueryCacheMode="normal";
+pragma yt.QueryCacheUseForCalc="true";
+
+insert into @tmp with truncate
+select * from Input
+where subkey == "bbb"
+order by key;
+
+commit;
+
+select * from Input as a
+inner join @tmp as b on a.key = b.key
+order by a.key, a.subkey;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_dup_key-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_dup_key-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_dup_key-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_dup_key.cfg b/yt/yql/tests/sql/suites/join/mapjoin_dup_key.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_dup_key.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_dup_key.sql b/yt/yql/tests/sql/suites/join/mapjoin_dup_key.sql
new file mode 100644
index 0000000000..54066e1d90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_dup_key.sql
@@ -0,0 +1,10 @@
+use plato;
+
+/* postgres can not */
+/* kikimr can not */
+
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+select *
+from Input1 as a join Input2 as b on a.key = b.key and a.subkey = b.key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite-off.cfg
new file mode 100644
index 0000000000..e76fa257e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite-off.cfg
@@ -0,0 +1,4 @@
+in Input uniqkeys.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.cfg
new file mode 100644
index 0000000000..0e7b4058e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.cfg
@@ -0,0 +1,2 @@
+in Input uniqkeys.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.sql b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.sql
new file mode 100644
index 0000000000..de352022c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+$subq = (SELECT CAST((CAST(subkey AS Int32) + 1) AS String) AS subkey_plus_one FROM Input);
+
+SELECT * FROM Input AS a JOIN $subq AS b ON a.subkey = b.subkey_plus_one order by subkey, key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence-off.cfg
new file mode 100644
index 0000000000..03784127c6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence-off.cfg
@@ -0,0 +1,6 @@
+in Input uniqkeys.txt
+in Dict1 sorted_uniq.txt
+in Dict2 sorted_uniq1.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.cfg
new file mode 100644
index 0000000000..eff6a05aeb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.cfg
@@ -0,0 +1,4 @@
+in Input uniqkeys.txt
+in Dict1 sorted_uniq.txt
+in Dict2 sorted_uniq1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.sql b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.sql
new file mode 100644
index 0000000000..bd93d67218
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_sequence.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+USE plato;
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+$subq = (SELECT key, CAST((CAST(subkey AS Int32) + 1) AS String) AS subkey_plus_one FROM Input);
+
+FROM $subq AS a
+JOIN Dict1 AS d1
+ON a.subkey_plus_one = d1.subkey
+JOIN Dict2 AS d2
+ON a.key = d2.key
+SELECT * ORDER BY a.key, a.subkey_plus_one;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star-off.cfg
new file mode 100644
index 0000000000..e76fa257e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star-off.cfg
@@ -0,0 +1,4 @@
+in Input uniqkeys.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.cfg b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.cfg
new file mode 100644
index 0000000000..0e7b4058e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.cfg
@@ -0,0 +1,2 @@
+in Input uniqkeys.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.sql b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.sql
new file mode 100644
index 0000000000..806a6ad8c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_early_rewrite_star.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+USE plato;
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+pragma yt.JoinEnableStarJoin="true";
+
+$subq = (SELECT CAST((CAST(subkey AS Int32) + 1) AS String) AS subkey_plus_one FROM Input);
+
+SELECT * FROM Input AS a JOIN $subq AS b ON a.subkey = b.subkey_plus_one order by subkey, key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_left_null_column-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.cfg b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.sql b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.sql
new file mode 100644
index 0000000000..df7b2ab987
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_left_null_column.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA yt.MapJoinLimit="1m";
+
+USE plato;
+
+$t = [<|"x":"150", "y":1, "z":Null|>, <|"x":"150", "y":2, "z":Null|>];
+
+SELECT * FROM Input1 AS a LEFT JOIN AS_TABLE($t) AS b ON a.key = b.x ORDER BY key, y;
+
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single-off.cfg
new file mode 100644
index 0000000000..c658c9ddb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single-off.cfg
@@ -0,0 +1,3 @@
+in Input input6.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.cfg
new file mode 100644
index 0000000000..684f1dbee4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.cfg
@@ -0,0 +1 @@
+in Input input6.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.sql
new file mode 100644
index 0000000000..518d33b511
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_non_optional_left_only_single.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"key1":"1", "subkey1":"a", "key":"1", "subkey":"a", "value":"value2_1"|>, <|"key1":"4", "subkey1":"d", "key":"4", "subkey":"d", "value":"value2_4"|>, <|"key1":"-5", "subkey1":"e", "key":"-5", "subkey":"e", "value":"value2_5"|>];
+
+SELECT *
+FROM
+ Input AS A
+LEFT ONLY JOIN
+ AS_TABLE($t) AS B
+ON
+ AsTuple(A.key, AsTuple(A.subkey, A.subkey1)) = AsTuple(B.key, AsTuple(B.subkey, B.subkey1))
+ORDER BY `key`;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single-off.cfg
new file mode 100644
index 0000000000..440cd8b680
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single-off.cfg
@@ -0,0 +1,3 @@
+in Input input5.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.sql
new file mode 100644
index 0000000000..d6eab69ed8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_only_single.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"key":"1", "subkey":"a", "value":"value2_1"|>, <|"key":"4", "subkey":"d", "value":"value2_4"|>, <|"key":"-5", "subkey":"e", "value":"value2_5"|>];
+
+SELECT *
+FROM
+ Input AS A
+LEFT ONLY JOIN
+ AS_TABLE($t) AS B
+ON
+ AsTuple(cast(A.key as uint64), cast(A.subkey as String)) = AsTuple(cast(B.key as int64), cast(B.subkey as Utf8))
+ORDER BY `key`;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many-off.cfg
new file mode 100644
index 0000000000..c658c9ddb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many-off.cfg
@@ -0,0 +1,3 @@
+in Input input6.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.cfg
new file mode 100644
index 0000000000..684f1dbee4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.cfg
@@ -0,0 +1 @@
+in Input input6.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.sql
new file mode 100644
index 0000000000..1175356b1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_many.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"key1":"1", "subkey1":"a", "key":"1", "subkey":"a", "value":"value2_1"|>, <|"key1":"4", "subkey1":"d", "key":"4", "subkey":"d", "value":"value2_4"|>, <|"key1":"-5", "subkey1":"e", "key":"-5", "subkey":"e", "value":"value2_5"|>];
+
+SELECT *
+FROM
+ Input AS A
+LEFT SEMI JOIN
+ AS_TABLE($t) AS B
+ON
+ AsTuple(cast(A.key as uint64), cast(A.subkey as String)) = AsTuple(cast(B.key as int64), cast(B.subkey as Utf8))
+ AND AsTuple(cast(A.key1 as uint64), cast(A.subkey1 as String)) = AsTuple(cast(B.key1 as int64), cast(B.subkey1 as Utf8))
+ORDER BY `key`;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single-off.cfg
new file mode 100644
index 0000000000..440cd8b680
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single-off.cfg
@@ -0,0 +1,3 @@
+in Input input5.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.sql
new file mode 100644
index 0000000000..959c476b80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_complex_type_optional_left_semi_single.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"key":"1", "subkey":"a", "value":"value2_1"|>, <|"key":"4", "subkey":"d", "value":"value2_4"|>, <|"key":"-5", "subkey":"e", "value":"value2_5"|>];
+
+SELECT *
+FROM
+ Input AS A
+LEFT SEMI JOIN
+ AS_TABLE($t) AS B
+ON
+ AsTuple(cast(A.key as uint64), cast(A.subkey as String)) = AsTuple(cast(B.key as int64), cast(B.subkey as Utf8))
+ORDER BY `key`;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord-off.cfg
new file mode 100644
index 0000000000..2dd54c12a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord-off.cfg
@@ -0,0 +1,5 @@
+in Input input4.txt
+res result.txt
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.cfg
new file mode 100644
index 0000000000..b4bb56a6bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.cfg
@@ -0,0 +1,3 @@
+in Input input4.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.sql
new file mode 100644
index 0000000000..660b2d36b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_tablerecord.sql
@@ -0,0 +1,10 @@
+use plato;
+pragma yt.MapJoinLimit="1M";
+
+$i = select TableRecordIndex() as ind, t.* from Input as t;
+$filter = select min(ind) as ind from $i group by subkey;
+
+select
+ *
+from Input
+where TableRecordIndex() in $filter;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type-off.cfg
new file mode 100644
index 0000000000..c658c9ddb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type-off.cfg
@@ -0,0 +1,3 @@
+in Input input6.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.cfg b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.cfg
new file mode 100644
index 0000000000..684f1dbee4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.cfg
@@ -0,0 +1 @@
+in Input input6.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.sql b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.sql
new file mode 100644
index 0000000000..2ee1b912b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_on_very_complex_type.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+$t = [<|"key1":"1", "subkey1":"a", "key":"1", "subkey":"a", "value":"value2_1"|>, <|"key1":"4", "subkey1":"d", "key":"4", "subkey":"d", "value":"value2_4"|>, <|"key1":"-5", "subkey1":"e", "key":"-5", "subkey":"e", "value":"value2_5"|>];
+
+SELECT *
+FROM
+ Input AS A
+LEFT SEMI JOIN
+ AS_TABLE($t) AS B
+ON
+ AsTuple(A.subkey, AsTuple(A.subkey1, AsTuple(CAST(A.key AS Int64), CAST(A.key1 AS Uint64)))) = AsTuple(B.subkey, AsTuple(B.subkey1, AsTuple(CAST(B.key AS Uint64), CAST(B.key1 AS Int64))))
+ORDER BY `key`;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.cfg b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.sql b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.sql
new file mode 100644
index 0000000000..73171384f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_opt_vs_2xopt.sql
@@ -0,0 +1,23 @@
+use plato;
+
+pragma yt.MapJoinLimit="1m";
+
+$t1 = AsList(
+ AsStruct(Just(1) AS Key),
+ AsStruct(Just(2) AS Key),
+ AsStruct(Just(3) AS Key));
+
+$t2 = AsList(
+ AsStruct(Just(Just(2)) AS Key),
+ AsStruct(Just(Just(3)) AS Key),
+ AsStruct(Just(Just(4)) AS Key),
+ AsStruct(Just(Just(5)) AS Key),
+ AsStruct(Just(Just(6)) AS Key));
+
+insert into @t1 select * from as_table($t1);
+insert into @t2 select * from as_table($t2);
+
+commit;
+
+select *
+from @t1 as a join @t2 as b using(Key);
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys-off.cfg
new file mode 100644
index 0000000000..e76fa257e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys-off.cfg
@@ -0,0 +1,4 @@
+in Input uniqkeys.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.cfg b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.cfg
new file mode 100644
index 0000000000..0e7b4058e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.cfg
@@ -0,0 +1,2 @@
+in Input uniqkeys.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.sql b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.sql
new file mode 100644
index 0000000000..2d152113e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_partial_uniq_keys.sql
@@ -0,0 +1,18 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+/* kikimr can not */
+/* ignore runonopt plan diff */
+USE plato;
+pragma yt.MapJoinLimit="1m";
+
+-- YQL-5582
+$join = (select
+ a.key as key,
+ a.subkey as subkey,
+ a.value as value
+from (select * from Input where value > "bbb") as a
+left join Input as b
+on a.key = b.key);
+
+
+select count(*) from $join;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_sharded.sql b/yt/yql/tests/sql/suites/join/mapjoin_sharded.sql
new file mode 100644
index 0000000000..e5af0c4509
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_sharded.sql
@@ -0,0 +1,13 @@
+use plato;
+
+/* postgres can not */
+/* kikimr can not */
+
+pragma DisableSimpleColumns;
+/* yt_local_var: MAP_JOIN_LIMIT = 30 */
+/* yqlrun_var: MAP_JOIN_LIMIT = 1000 */
+pragma yt.MapJoinLimit="MAP_JOIN_LIMIT";
+pragma yt.MapJoinShardCount = "10";
+
+select *
+from Input1 as a join Input2 as b on a.key = b.key and a.subkey = b.key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.sql
new file mode 100644
index 0000000000..d574e50062
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_unused_keys.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+use plato;
+pragma yt.MapJoinLimit="1m";
+pragma yt.DisableOptimizers="PhysicalOptimizer-FuseInnerMap";
+
+select
+
+v3
+
+from Input1 as a
+join Input2 as b on (a.k1 = b.k2)
+join Input3 as c on (a.k1 = c.k3)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous-off.cfg
new file mode 100644
index 0000000000..08630ad2c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous-off.cfg
@@ -0,0 +1,4 @@
+in Input input1.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.cfg
new file mode 100644
index 0000000000..c8889a670f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.sql b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.sql
new file mode 100644
index 0000000000..0a6476fbda
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_anonymous.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* kikimr can not */
+use plato;
+pragma DisableSimpleColumns;
+
+pragma yt.MapJoinLimit="1m";
+
+insert into @tmp select * from Input where key > "100";
+commit;
+
+select * from Input as a
+left join @tmp as b on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read-off.cfg
new file mode 100644
index 0000000000..63f3b16e05
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read-off.cfg
@@ -0,0 +1,3 @@
+in Input input1.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.cfg
new file mode 100644
index 0000000000..5b34491eb1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.cfg
@@ -0,0 +1,4 @@
+in Input input1.txt
+res result.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.sql b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.sql
new file mode 100644
index 0000000000..eae0db98d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_read.sql
@@ -0,0 +1,20 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+/* kikimr can not */
+use plato;
+pragma yt.mapjoinlimit="1m";
+
+$cnt = (select count(*) from Input);
+$offset = ($cnt + 10) ?? 0;
+
+$in1 = (select key from Input where key != "" order by key limit 10 offset $offset);
+
+select * from Input as a
+left join $in1 as b on a.key = b.key;
+
+$limit = ($cnt / 100) ?? 0;
+
+$in2 = (select key from Input where key != "" limit $limit);
+
+select * from Input as a
+left only join $in2 as b on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct-off.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct-off.cfg
new file mode 100644
index 0000000000..08630ad2c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct-off.cfg
@@ -0,0 +1,4 @@
+in Input input1.txt
+res result.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.cfg b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.cfg
new file mode 100644
index 0000000000..c8889a670f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.sql b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.sql
new file mode 100644
index 0000000000..c0fcc01374
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mapjoin_with_empty_struct.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+/* kikimr can not */
+/* ignore yt detailed plan diff */
+use plato;
+pragma yt.MapJoinLimit="10M";
+
+$sizes = (
+ SELECT
+ 0 AS id
+ FROM Input
+);
+
+SELECT d.key FROM Input as d CROSS JOIN $sizes as s ORDER BY d.key;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce-off.cfg
new file mode 100644
index 0000000000..489ecd7e4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce-off.cfg
@@ -0,0 +1,3 @@
+in Input sorted_uniq2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.cfg b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.cfg
new file mode 100644
index 0000000000..de96d331e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.cfg
@@ -0,0 +1 @@
+in Input sorted_uniq2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.sql b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.sql
new file mode 100644
index 0000000000..bcd9751286
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_any_no_join_reduce.sql
@@ -0,0 +1,5 @@
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="2";
+
+select * from Input where key in (select "023" as key union all select "911" as key union all select "911" as key);
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_big_primary-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary.cfg b/yt/yql/tests/sql/suites/join/mergejoin_big_primary.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary.sql b/yt/yql/tests/sql/suites/join/mergejoin_big_primary.sql
new file mode 100644
index 0000000000..a05dcc865c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+pragma yt.JoinMergeUseSmallAsPrimary="false";
+
+-- Input2 is smaller than Input1
+select * from Input1 as a join Input2 as b on a.k1 = b.k2
+order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique-off.cfg
new file mode 100644
index 0000000000..e41a2c5556
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1_unique.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.cfg b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.cfg
new file mode 100644
index 0000000000..c0114c4136
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1_unique.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.sql b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.sql
new file mode 100644
index 0000000000..79ac405416
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_big_primary_unique.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+pragma yt.JoinMergeUseSmallAsPrimary="false";
+
+-- Input2 is smaller than Input1, but Input1 has unique keys
+select * from Input1 as a join Input2 as b on a.k1 = b.k2 and a.v1 = b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.cfg b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.sql b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.sql
new file mode 100644
index 0000000000..97d4a93ea3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+-- Input2 is smaller than Input1
+select * from Input1 as a join Input2 as b on a.k1 = b.k2
+order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.cfg b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.cfg
new file mode 100644
index 0000000000..23a3ae77d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+pragma yt.ParallelOperationsLimit="1"
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.sql b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.sql
new file mode 100644
index 0000000000..aad534d5dd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_choose_primary_with_retry.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+-- emulate monsters in big table
+pragma yt.JoinMergeReduceJobMaxSize="1";
+
+-- Input2 is smaller than Input1
+select * from Input1 as a join Input2 as b on a.k1 = b.k2
+order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align1-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align1-off.cfg
new file mode 100644
index 0000000000..9299e9217a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align1-off.cfg
@@ -0,0 +1,3 @@
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align1.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align1.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align1.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align1.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_align1.sql
new file mode 100644
index 0000000000..3504fd3cf1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align1.sql
@@ -0,0 +1,26 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+pragma yt.JoinMergeTablesLimit="100";
+pragma yt.JoinMergeForce;
+
+insert into @t1
+select 1 as k1, 10 as v1;
+
+insert into @t2
+select 1u as k2, 100 as v2;
+
+insert into @t3
+select 1us as k3, 1000 as v3;
+
+insert into @t4
+select 1s as k4, 10000 as v4;
+
+commit;
+
+
+select * from (select * from @t1 as a join @t3 as c on a.k1 = c.k3) as ac
+ join (select * from @t2 as b join @t4 as d on b.k2 = d.k4) as bd on ac.k1 = bd.k2 and ac.k3 = bd.k4;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align2-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align2-off.cfg
new file mode 100644
index 0000000000..9299e9217a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align2-off.cfg
@@ -0,0 +1,3 @@
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align2.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align2.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align2.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align2.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_align2.sql
new file mode 100644
index 0000000000..695adedf4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align2.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+pragma yt.JoinMergeTablesLimit="100";
+
+insert into @t1
+select 1 as k1, 10 as v1;
+
+insert into @t2
+select 1u as k2, 100 as v2;
+
+insert into @t3
+select 1us as k3, 1000 as v3;
+
+commit;
+
+select * from @t2 as b
+ left join /*+ merge() */ @t3 as c on b.k2 = c.k3
+ left join @t1 as a on a.k1 = b.k2 and a.k1=c.k3;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align3-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align3-off.cfg
new file mode 100644
index 0000000000..9299e9217a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align3-off.cfg
@@ -0,0 +1,3 @@
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align3.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_align3.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align3.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_align3.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_align3.sql
new file mode 100644
index 0000000000..1cb847dd29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_align3.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+pragma yt.JoinMergeTablesLimit="100";
+pragma yt.JoinMergeForce;
+
+insert into @t1
+select (1, 1u) as k1, 100u as v1;
+
+insert into @t2
+select (1u, 1) as k2, 100 as v2;
+
+
+commit;
+
+select * from @t1 as a join @t2 as b on a.k1 = b.k2 and a.v1 = b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.sql
new file mode 100644
index 0000000000..a7cd554ffb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_no_sorted.sql
@@ -0,0 +1,5 @@
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeForce="true";
+
+select a.key as key from Input1 as a join Input2 as b using(key) order by key;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted-off.cfg
new file mode 100644
index 0000000000..644d022f87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted-off.cfg
@@ -0,0 +1,4 @@
+in Input input1.txt
+in InputSorted sorted_uniq.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.cfg
new file mode 100644
index 0000000000..a85b008cc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+in InputSorted sorted_uniq.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.sql
new file mode 100644
index 0000000000..ad74c2340b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_one_sorted.sql
@@ -0,0 +1,6 @@
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeForce="true";
+pragma yt.JoinMergeUnsortedFactor="0";
+
+select a.key as key from InputSorted as a join Input as b using(key) order by key;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_per_link-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link-off.cfg
new file mode 100644
index 0000000000..7f40aa5617
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link-off.cfg
@@ -0,0 +1,6 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.cfg b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.cfg
new file mode 100644
index 0000000000..f22309ab5f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.cfg
@@ -0,0 +1,4 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.sql b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.sql
new file mode 100644
index 0000000000..7a30768b9f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_force_per_link.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+
+select
+ a.key as k1,
+ b.key as k2,
+ c.key as k3,
+ a.subkey as sk1,
+ b.subkey as sk2,
+ c.subkey as sk3
+from
+ Input1 as a join Input2 as b on a.key = b.key
+ join /*+ merge() */ Input3 as c on b.key = c.key
+order by k3
+;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_input1.txt.attr b/yt/yql/tests/sql/suites/join/mergejoin_input1.txt.attr
new file mode 100644
index 0000000000..6a779223f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_input1.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "PhraseID";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "uint64"
+ };
+ {
+ "name" = "BaseNo";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "uint16"
+ };
+ {
+ "name" = "Text";
+ "required" = %false;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_input2.txt.attr b/yt/yql/tests/sql/suites/join/mergejoin_input2.txt.attr
new file mode 100644
index 0000000000..1a5403e22b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_input2.txt.attr
@@ -0,0 +1,60 @@
+{
+ "_yql_row_spec" = {
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "BannerID";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ]
+ ];
+ [
+ "BaseNo";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint16"
+ ]
+ ]
+ ];
+ [
+ "PhraseID";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ]
+ ];
+ [
+ "ResultCost";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ]
+ ];
+ [
+ "ResultFlatCost";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ]
+ ]
+ ]
+ ]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_left_null_column-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column-off.cfg
new file mode 100644
index 0000000000..0eb1ab8cde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column-off.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.cfg b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.cfg
new file mode 100644
index 0000000000..fa48e4fa82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.cfg
@@ -0,0 +1 @@
+in Input1 sorted_by_kv1.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.sql b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.sql
new file mode 100644
index 0000000000..1dd27bcc3a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_left_null_column.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA yt.JoinMergeTablesLimit="10";
+PRAGMA yt.JoinAllowColumnRenames="true";
+PRAGMA yt.JoinMergeUnsortedFactor="5.0";
+
+USE plato;
+
+$t = [<|"x":"bbb", "y":1, "z":Null|>, <|"x":"bbb", "y":2, "z":Null|>];
+
+SELECT * FROM Input1 AS a LEFT JOIN AS_TABLE($t) AS b ON a.k1 = b.x ORDER BY k1, y;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort-off.cfg
new file mode 100644
index 0000000000..a15ee3ce2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.cfg b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.cfg
new file mode 100644
index 0000000000..4d81d34ed9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.sql b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.sql
new file mode 100644
index 0000000000..c5ddba7f1b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_narrows_output_sort.sql
@@ -0,0 +1,11 @@
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3";
+pragma yt.JoinAllowColumnRenames="true";
+pragma SimpleColumns;
+
+from Input3 as c
+join Input4 as d on c.k3 = d.k4
+right only join Input1 as a on a.k1 = c.k3 and a.v1 = c.v3
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort-off.cfg
new file mode 100644
index 0000000000..8e80f78742
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort-off.cfg
@@ -0,0 +1,4 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.cfg
new file mode 100644
index 0000000000..ea9e6ce443
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.cfg
@@ -0,0 +1,2 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.sql b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.sql
new file mode 100644
index 0000000000..24b8a2901b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort.sql
@@ -0,0 +1,42 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="0";
+pragma yt.JoinAllowColumnRenames="true";
+pragma yt.JoinMergeSetTopLevelFullSort="true";
+
+FROM SortedBySubkeyValue AS a INNER JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key, a.subkey, a.value
+ORDER BY a.subkey, a.value, b.key;
+
+FROM SortedBySubkeyValue AS a RIGHT JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key, a.subkey, a.value
+ORDER BY b.key;
+
+FROM SortedBySubkeyValue AS a LEFT JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key, a.subkey, a.value
+ORDER BY a.subkey, a.value;
+
+FROM SortedBySubkeyValue AS a FULL JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key, a.subkey, a.value
+ORDER BY b.key, a.subkey, a.value;
+
+FROM SortedBySubkeyValue AS a RIGHT ONLY JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key
+ORDER BY b.key;
+
+FROM SortedBySubkeyValue AS a LEFT ONLY JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT a.subkey, a.value
+ORDER BY a.subkey, a.value;
+
+FROM SortedBySubkeyValue AS a EXCLUSION JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key, a.subkey, a.value
+ORDER BY b.key, a.subkey, a.value;
+
+FROM SortedBySubkeyValue AS a RIGHT SEMI JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT b.key
+ORDER BY b.key;
+
+FROM SortedBySubkeyValue AS a LEFT SEMI JOIN SortedByKey AS b ON a.subkey = b.key
+SELECT a.subkey, a.value
+ORDER BY a.subkey, a.value;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross-off.cfg
new file mode 100644
index 0000000000..287d1fa1ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross-off.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.cfg
new file mode 100644
index 0000000000..88a5beef60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.sql b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.sql
new file mode 100644
index 0000000000..8775257805
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_cross.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="0";
+pragma yt.JoinAllowColumnRenames="true";
+pragma yt.JoinMergeSetTopLevelFullSort="true";
+
+FROM Input1 AS a JOIN Input2 AS b ON b.k2 = a.k1
+ CROSS JOIN Input3 AS c
+SELECT c.k3 AS ck3, c.k3 AS ck3_extra, c.v3, a.k1 as ak1 ORDER BY ak1, ck3;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested-off.cfg
new file mode 100644
index 0000000000..7859898010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.cfg
new file mode 100644
index 0000000000..086641db8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.sql b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.sql
new file mode 100644
index 0000000000..3e01d0acda
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_nested.sql
@@ -0,0 +1,12 @@
+/* ignore yt detailed plan diff */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="0";
+pragma yt.JoinAllowColumnRenames="true";
+
+FROM Input1 AS a JOIN Input2 AS b ON b.k2 = a.k1 AND a.v1 = b.v2
+ JOIN Input3 AS c ON a.k1 = c.k3 AND a.v1 = c.v3
+SELECT c.k3 AS ck3, c.k3 AS ck3_extra, c.k3 AS ck3_extra2, c.v3, a.k1 as ak1
+ORDER BY ck3, ck3_extra, ck3_extra2, c.v3 -- should be noop
+;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.cfg b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.cfg
new file mode 100644
index 0000000000..c13c3496d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted1.txt
+in Input2 kv2_sorted1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.sql b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.sql
new file mode 100644
index 0000000000..bc9b116f5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_saves_output_sort_unmatched.sql
@@ -0,0 +1,11 @@
+/* ignore yt detailed plan diff */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="0";
+pragma yt.JoinAllowColumnRenames="true";
+
+FROM Input1 AS a JOIN Input2 AS b ON b.k2 = a.k1 AND a.v1 = b.v2
+SELECT b.k2 AS bk2, b.v2 as bv2, a.k1 as ak1
+ORDER BY bv2 -- should be a separate sort
+;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner-off.cfg
new file mode 100644
index 0000000000..d2366da42e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner-off.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.cfg b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.cfg
new file mode 100644
index 0000000000..829b6d19f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.cfg
@@ -0,0 +1,4 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.sql b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.sql
new file mode 100644
index 0000000000..4897e2737b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_composite_to_inner.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3";
+pragma yt.JoinAllowColumnRenames="true";
+
+$semi = select * from Input3 as c join Input4 as d on c.k3 = d.k4;
+
+from $semi as semi
+right semi join Input1 as a on a.k1 = semi.k3 and a.v1 = semi.v3
+join Input2 as b on b.k2 = a.k1 and b.v2 = a.v1
+select * order by u1;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner-off.cfg
new file mode 100644
index 0000000000..aed2b8c61b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner-off.cfg
@@ -0,0 +1,4 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.cfg b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.cfg
new file mode 100644
index 0000000000..6098eb907d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.cfg
@@ -0,0 +1,2 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.sql b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.sql
new file mode 100644
index 0000000000..3778d9f05b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_semi_to_inner.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="0";
+pragma yt.JoinAllowColumnRenames="true";
+
+from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2 and a.v1 = b.v2
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_small_primary-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_small_primary-off.cfg
new file mode 100644
index 0000000000..1f7a620911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_small_primary-off.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_small_primary.cfg b/yt/yql/tests/sql/suites/join/mergejoin_small_primary.cfg
new file mode 100644
index 0000000000..df8cd9f2c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_small_primary.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_small_primary.sql b/yt/yql/tests/sql/suites/join/mergejoin_small_primary.sql
new file mode 100644
index 0000000000..be3ce895b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_small_primary.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+pragma yt.JoinMergeUseSmallAsPrimary="true";
+
+-- Input2 is smaller than Input1
+select * from Input2 as b join Input1 as a on a.k1 = b.k2
+order by a.v1, b.v2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.cfg b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.cfg
new file mode 100644
index 0000000000..1af5db027b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.cfg
@@ -0,0 +1,3 @@
+providers yt
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.sql b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.sql
new file mode 100644
index 0000000000..86a76d3573
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_inner.sql
@@ -0,0 +1,15 @@
+/* ignore yt detailed plan diff */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+$inner =
+ (FROM Input1 AS a JOIN Input2 AS b ON b.k2 = a.k1 AND a.v1 = b.v2
+ SELECT b.k2 AS bk2, b.k2 AS bk2_extra, b.v2 AS bv2, a.k1 as ak1);
+
+SELECT * FROM $inner ORDER BY bv2, bk2_extra;
+SELECT * FROM $inner ORDER BY bk2, bk2_extra, bv2;
+SELECT * FROM $inner ORDER BY bk2_extra, bv2;
+SELECT * FROM $inner ORDER BY bk2_extra;
+SELECT * FROM $inner ORDER BY ak1;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.cfg b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.cfg
new file mode 100644
index 0000000000..2de8793752
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.cfg
@@ -0,0 +1,3 @@
+providers yt
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.sql b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.sql
new file mode 100644
index 0000000000..16c281d696
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_left.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+$left =
+ (FROM Input1 AS a LEFT JOIN Input2 AS b ON b.k2 = a.k1
+ SELECT b.k2 AS bk2, b.k2 AS bk2_extra, b.v2 AS bv2, a.k1 as ak1);
+
+SELECT * FROM $left ORDER BY bv2, bk2_extra;
+SELECT * FROM $left ORDER BY bk2, bk2_extra, bv2;
+SELECT * FROM $left ORDER BY bk2_extra, bv2;
+SELECT * FROM $left ORDER BY bk2_extra;
+SELECT * FROM $left ORDER BY ak1;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.cfg b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.cfg
new file mode 100644
index 0000000000..2de8793752
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.cfg
@@ -0,0 +1,3 @@
+providers yt
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.sql b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.sql
new file mode 100644
index 0000000000..ed613582c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_nomatch.sql
@@ -0,0 +1,8 @@
+/* ignore yt detailed plan diff */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+FROM Input1 AS a JOIN Input2 AS b ON b.k2 = a.k1
+SELECT b.v2 AS bv2, a.k1 as ak1 ORDER BY ak1, bv2;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.cfg b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.cfg
new file mode 100644
index 0000000000..1af5db027b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.cfg
@@ -0,0 +1,3 @@
+providers yt
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.sql b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.sql
new file mode 100644
index 0000000000..2e4238f110
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_sorts_output_for_sort_right.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinAllowColumnRenames="true";
+
+$right =
+ (FROM Input1 AS a RIGHT JOIN Input2 AS b ON b.k2 = a.k1 AND a.v1 = b.v2
+ SELECT b.k2 AS bk2, b.k2 AS bk2_extra, b.v2 AS bv2, a.k1 as ak1, a.v1 as av1);
+
+SELECT * FROM $right ORDER BY bv2, bk2_extra;
+SELECT * FROM $right ORDER BY bk2, bk2_extra, bv2;
+SELECT * FROM $right ORDER BY bk2_extra, bv2;
+SELECT * FROM $right ORDER BY bk2_extra;
+SELECT * FROM $right ORDER BY ak1, av1;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.sql
new file mode 100644
index 0000000000..78bc056914
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_unused_keys.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+
+select
+
+v3
+
+from Input1 as a
+join Input2 as b on (a.k1 = b.k2)
+join Input3 as c on (a.k1 = c.k3)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names-off.cfg
new file mode 100644
index 0000000000..8e80f78742
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names-off.cfg
@@ -0,0 +1,4 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.cfg
new file mode 100644
index 0000000000..ea9e6ce443
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.cfg
@@ -0,0 +1,2 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.sql
new file mode 100644
index 0000000000..7fe038ad6a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names.sql
@@ -0,0 +1,19 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+pragma yt.JoinAllowColumnRenames="true";
+
+
+FROM SortedBySubkeyValue as a JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY a.subkey, b.key;
+
+FROM SortedBySubkeyValue as a JOIN SortedByKey as b on a.subkey=b.key
+SELECT a.subkey, b.key ORDER BY a.subkey, b.key;
+
+
+FROM SortedBySubkeyValue as a LEFT JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY a.subkey;
+
+FROM SortedBySubkeyValue as a RIGHT JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY b.key;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested-off.cfg
new file mode 100644
index 0000000000..5d2e73b721
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested-off.cfg
@@ -0,0 +1,5 @@
+in Input sorted_by_key1.txt
+in Input1 sorted_by_k1.txt
+in Input2 sorted_by_k2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.cfg
new file mode 100644
index 0000000000..15fbfe10b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.cfg
@@ -0,0 +1,3 @@
+in Input sorted_by_key1.txt
+in Input1 sorted_by_k1.txt
+in Input2 sorted_by_k2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.sql
new file mode 100644
index 0000000000..427553d99e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nested.sql
@@ -0,0 +1,11 @@
+/* ignore yt detailed plan diff */
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+pragma yt.JoinAllowColumnRenames="true";
+
+FROM Input AS a JOIN Input1 AS b ON b.k1=a.key
+ JOIN Input2 AS c ON a.key=c.k2
+SELECT a.value as avalue, b.v1, c.k2 as ck2 ORDER BY avalue, b.v1, ck2;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted-off.cfg
new file mode 100644
index 0000000000..ec195ece46
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted-off.cfg
@@ -0,0 +1,4 @@
+in Unsorted input2.txt
+in SortedBySubkeyValue sorted_uniq1.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.cfg
new file mode 100644
index 0000000000..e049d17dbf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.cfg
@@ -0,0 +1,2 @@
+in Unsorted input2.txt
+in SortedBySubkeyValue sorted_uniq1.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.sql
new file mode 100644
index 0000000000..d97fb38e04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_nonsorted.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="100.0";
+pragma yt.JoinAllowColumnRenames="true";
+
+$unsorted = (SELECT key, CAST((CAST(subkey as Int32) + 2) as String) as sk, value as val FROM Unsorted);
+
+FROM SortedBySubkeyValue AS a JOIN $unsorted AS b ON a.subkey=b.sk AND a.value=b.val
+SELECT * ORDER BY a.key,b.key;
+
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename-off.cfg
new file mode 100644
index 0000000000..8e80f78742
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename-off.cfg
@@ -0,0 +1,4 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.cfg
new file mode 100644
index 0000000000..ea9e6ce443
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.cfg
@@ -0,0 +1,2 @@
+in SortedByKey sorted_uniq.txt
+in SortedBySubkeyValue sorted_uniq1.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.sql
new file mode 100644
index 0000000000..07ad22faf7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_different_key_names_norename.sql
@@ -0,0 +1,19 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+pragma yt.JoinAllowColumnRenames="false";
+
+
+FROM SortedBySubkeyValue as a JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY a.subkey, b.key;
+
+FROM SortedBySubkeyValue as a JOIN SortedByKey as b on a.subkey=b.key
+SELECT a.subkey, b.key ORDER BY a.subkey, b.key;
+
+
+FROM SortedBySubkeyValue as a LEFT JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY a.subkey;
+
+FROM SortedBySubkeyValue as a RIGHT JOIN SortedByKey as b on a.subkey=b.key
+SELECT * ORDER BY b.key;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order-off.cfg
new file mode 100644
index 0000000000..01597c0916
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order-off.cfg
@@ -0,0 +1,4 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.cfg
new file mode 100644
index 0000000000..3ea969d8b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.cfg
@@ -0,0 +1,2 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.sql
new file mode 100644
index 0000000000..5cc0731682
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_reverse_key_order.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+SELECT pd.Text
+ FROM Input2 as m2
+ INNER JOIN Input1 as pd
+ USING (BaseNo, PhraseID)
+ORDER BY pd.Text;
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_table_range-off.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range-off.cfg
new file mode 100644
index 0000000000..7dd23dd911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range-off.cfg
@@ -0,0 +1,6 @@
+in Left1 sorted_by_key1.txt
+in Left2 sorted_by_key2.txt
+in Right1 sorted_by_key3.txt
+in Right2 sorted_by_key4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.cfg b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.cfg
new file mode 100644
index 0000000000..5182327159
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.cfg
@@ -0,0 +1,4 @@
+in Left1 sorted_by_key1.txt
+in Left2 sorted_by_key2.txt
+in Right1 sorted_by_key3.txt
+in Right2 sorted_by_key4.txt
diff --git a/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.sql b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.sql
new file mode 100644
index 0000000000..95f96e883f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/mergejoin_with_table_range.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+SELECT *
+ FROM CONCAT("Left1", "Left2") as a
+ INNER JOIN CONCAT("Right1", "Right2") as b
+ USING(key)
+ORDER BY a.value,b.value;
+
diff --git a/yt/yql/tests/sql/suites/join/nested_semi_join-off.cfg b/yt/yql/tests/sql/suites/join/nested_semi_join-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nested_semi_join-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/nested_semi_join.cfg b/yt/yql/tests/sql/suites/join/nested_semi_join.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nested_semi_join.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/nested_semi_join.sql b/yt/yql/tests/sql/suites/join/nested_semi_join.sql
new file mode 100644
index 0000000000..f8b8277292
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nested_semi_join.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+use plato;
+
+$w1 = (select u.subkey as subkey, u.value as value from Input1 as u left semi join Input1 as v on u.key == v.key);
+
+$t1 = (select x.value from Input1 as x left semi join $w1 as y on x.subkey == y.subkey);
+
+select * from $t1;
diff --git a/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn-off.cfg b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn-off.cfg
new file mode 100644
index 0000000000..893ac062c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn-off.cfg
@@ -0,0 +1,5 @@
+in Input1 empty_dynamic.txt
+in Input2 empty_dynamic.txt
+providers yt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.cfg b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.cfg
new file mode 100644
index 0000000000..9b9c114a16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.cfg
@@ -0,0 +1,3 @@
+in Input1 empty_dynamic.txt
+in Input2 empty_dynamic.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.sql b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.sql
new file mode 100644
index 0000000000..cb7b8b50d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/no_empty_join_for_dyn.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+SELECT *
+FROM plato.Input1 as A
+INNER JOIN plato.Input2 as B
+ON A.key=B.key;
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner-off.cfg b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.cfg b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.sql b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.sql
new file mode 100644
index 0000000000..ed4f7c70ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_over_inner.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+-- should not pushdown
+select * from Input1 as a inner join Input2 as b on a.key = b.key where Unwrap(cast(a.key as Int32)) > 100 order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on-off.cfg b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.cfg b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.sql b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.sql
new file mode 100644
index 0000000000..6066449757
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/nopushdown_filter_with_depends_on.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* hybridfile can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 4 */
+use plato;
+
+-- should not pushdown
+select * from Input1 as a left semi join Input2 as b using(key) where Random(TableRow()) < 0.1 order by key;
+
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side-off.cfg b/yt/yql/tests/sql/suites/join/opt_on_opt_side-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side.cfg b/yt/yql/tests/sql/suites/join/opt_on_opt_side.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side.sql b/yt/yql/tests/sql/suites/join/opt_on_opt_side.sql
new file mode 100644
index 0000000000..f4abb9909e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side.sql
@@ -0,0 +1,20 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+SELECT
+ A.key,
+ B.subkey
+FROM
+ Input2 AS A
+LEFT JOIN
+ (
+ SELECT
+ key,
+ CAST(key AS INT) AS subkey
+ FROM
+ Input3
+ ) AS B
+ON
+ A.key == B.key
+ORDER BY A.key
+;
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group-off.cfg b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.cfg b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.sql b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.sql
new file mode 100644
index 0000000000..f01cd2147d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/opt_on_opt_side_with_group.sql
@@ -0,0 +1,24 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+SELECT
+ A.key as key,
+ B.subkey,
+ COUNT(*) AS count
+FROM
+ Input2 AS A
+LEFT JOIN
+ (
+ SELECT
+ key,
+ CAST(key AS INT) AS subkey
+ FROM
+ Input3
+ ) AS B
+ON
+ A.key == B.key
+GROUP BY
+ A.key, B.subkey
+ORDER BY
+ key
+;
diff --git a/yt/yql/tests/sql/suites/join/order_of_qualified-off.cfg b/yt/yql/tests/sql/suites/join/order_of_qualified-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/order_of_qualified-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/order_of_qualified.cfg b/yt/yql/tests/sql/suites/join/order_of_qualified.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/order_of_qualified.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/order_of_qualified.sql b/yt/yql/tests/sql/suites/join/order_of_qualified.sql
new file mode 100644
index 0000000000..a28e3beaea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/order_of_qualified.sql
@@ -0,0 +1,6 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+SELECT b.*,1 as q,a.*
+FROM Input2 AS a
+JOIN Input3 AS b
+ON a.value == b.value;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_cross-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_cross-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_cross-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_cross.cfg b/yt/yql/tests/sql/suites/join/premap_common_cross.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_cross.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_cross.sql b/yt/yql/tests/sql/suites/join/premap_common_cross.sql
new file mode 100644
index 0000000000..2790c4a108
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_cross.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key as akey, subkey, value as avalue from Input1) as a
+cross join Input2 as b
+select a.akey, a.subkey, b.subkey, b.value
+order by a.akey, a.subkey, b.subkey, b.value;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner.sql b/yt/yql/tests/sql/suites/join/premap_common_inner.sql
new file mode 100644
index 0000000000..eab52d0662
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key, subkey, 1 as value from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, a.value, b.value
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.sql b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.sql
new file mode 100644
index 0000000000..7689cc7fa6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_both_sides.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key, subkey, 1 as value from Input1) as a
+join (select key, subkey, 2 as value from Input2) as b using(key)
+select a.key as key, a.subkey, a.value, b.subkey, b.value
+order by key;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_filter-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner_filter-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_filter-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_filter.cfg b/yt/yql/tests/sql/suites/join/premap_common_inner_filter.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_filter.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_inner_filter.sql b/yt/yql/tests/sql/suites/join/premap_common_inner_filter.sql
new file mode 100644
index 0000000000..24d54e5f9c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_inner_filter.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key, subkey || key as subkey, value from Input1 where value != "ddd") as a
+join Input2 as b using(key)
+select a.key, a.subkey, b.value
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_left_cross-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_left_cross-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_left_cross-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_left_cross.cfg b/yt/yql/tests/sql/suites/join/premap_common_left_cross.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_left_cross.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_left_cross.sql b/yt/yql/tests/sql/suites/join/premap_common_left_cross.sql
new file mode 100644
index 0000000000..a7c8302df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_left_cross.sql
@@ -0,0 +1,13 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+$one = (select key, 1 as subkey, value from Input1);
+$two = (select key, value from Input2);
+$three = (select key, value, 2 as subkey from Input3);
+
+from $one as a
+cross join $two as b
+left join $three as c on (c.key = a.key and c.value = b.value)
+select * order by a.key,a.subkey,b.key,b.value
+
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_multiparents-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents.cfg b/yt/yql/tests/sql/suites/join/premap_common_multiparents.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents.sql b/yt/yql/tests/sql/suites/join/premap_common_multiparents.sql
new file mode 100644
index 0000000000..e31ee06f4e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents.sql
@@ -0,0 +1,15 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+$map = (select key, subkey, 1 as value, 2 as another from Input1);
+
+from $map as a
+join Input2 as b using(key)
+select a.key, a.value, b.value
+order by a.key,a.value;
+
+from $map as a
+join Input3 as b using(key)
+select a.key, a.value, a.subkey, b.value
+order by a.key,a.value;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.cfg b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.sql b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.sql
new file mode 100644
index 0000000000..e49c29fa42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_multiparents_no_premap.sql
@@ -0,0 +1,14 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+$map = (select key, subkey, 1 as value, 2 as another from Input1);
+
+from $map as a
+join Input2 as b using(key)
+select a.key, a.value, b.value
+order by a.key,a.value;
+
+from $map as a
+select a.key, a.value, a.subkey
+order by a.key,a.value;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.cfg b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.sql b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.sql
new file mode 100644
index 0000000000..1bd47b60a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_right_tablecontent.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+
+$keys = (select key from Input3);
+
+from (select key, value, key IN $keys as flag from Input1) as a
+right join (select key, key IN $keys as flag from Input2) as b using(key)
+select a.key, a.value, a.flag, b.flag
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/premap_common_semi-off.cfg b/yt/yql/tests/sql/suites/join/premap_common_semi-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_semi-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_common_semi.cfg b/yt/yql/tests/sql/suites/join/premap_common_semi.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_semi.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_common_semi.sql b/yt/yql/tests/sql/suites/join/premap_common_semi.sql
new file mode 100644
index 0000000000..343b8748b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_common_semi.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key, subkey as asubkey, value from Input1) as a
+left semi join (select key, 1 as value from Input2) as b using(key)
+select a.key, a.asubkey
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/premap_context_dep-off.cfg b/yt/yql/tests/sql/suites/join/premap_context_dep-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_context_dep-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_context_dep.cfg b/yt/yql/tests/sql/suites/join/premap_context_dep.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_context_dep.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_context_dep.sql b/yt/yql/tests/sql/suites/join/premap_context_dep.sql
new file mode 100644
index 0000000000..277a634626
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_context_dep.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+from (select key, subkey || key as subkey, value, TableRecordIndex() as tr from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, a.tr, b.value
+order by a.key, a.tr;
diff --git a/yt/yql/tests/sql/suites/join/premap_map_cross-off.cfg b/yt/yql/tests/sql/suites/join/premap_map_cross-off.cfg
new file mode 100644
index 0000000000..287d1fa1ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_cross-off.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_map_cross.cfg b/yt/yql/tests/sql/suites/join/premap_map_cross.cfg
new file mode 100644
index 0000000000..88a5beef60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_cross.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_map_cross.sql b/yt/yql/tests/sql/suites/join/premap_map_cross.sql
new file mode 100644
index 0000000000..75ec5b34cf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_cross.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.MapJoinLimit="1m";
+
+from (select k1, v1, Just(1) as u1 from Input1) as a
+cross join (select k2, v2, Just(2) as u2 from Input2) as b
+select *
+order by a.k1,b.k2,a.v1,b.v2;
diff --git a/yt/yql/tests/sql/suites/join/premap_map_inner-off.cfg b/yt/yql/tests/sql/suites/join/premap_map_inner-off.cfg
new file mode 100644
index 0000000000..287d1fa1ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_inner-off.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_map_inner.cfg b/yt/yql/tests/sql/suites/join/premap_map_inner.cfg
new file mode 100644
index 0000000000..88a5beef60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_inner.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_map_inner.sql b/yt/yql/tests/sql/suites/join/premap_map_inner.sql
new file mode 100644
index 0000000000..737b8a2de0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_inner.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.MapJoinLimit="1m";
+
+from (select k1, v1 as u1 from Input1) as a
+join (select k2, v2 as u2 from Input2) as b on a.k1 = b.k2
+select a.k1,a.u1,b.u2
+order by a.k1,a.u1;
diff --git a/yt/yql/tests/sql/suites/join/premap_map_semi-off.cfg b/yt/yql/tests/sql/suites/join/premap_map_semi-off.cfg
new file mode 100644
index 0000000000..287d1fa1ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_semi-off.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_map_semi.cfg b/yt/yql/tests/sql/suites/join/premap_map_semi.cfg
new file mode 100644
index 0000000000..88a5beef60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_semi.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_map_semi.sql b/yt/yql/tests/sql/suites/join/premap_map_semi.sql
new file mode 100644
index 0000000000..c8ea1a1ef8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_map_semi.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.MapJoinLimit="1m";
+
+from (select k1, v1 || u1 as v1 from Input1) as a
+left semi join (select k2, u2 || v2 as u2 from Input2) as b on a.k1 = b.k2
+select *
+order by a.k1,a.v1;
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort1-off.cfg b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1-off.cfg
new file mode 100644
index 0000000000..01597c0916
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1-off.cfg
@@ -0,0 +1,4 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.cfg b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.cfg
new file mode 100644
index 0000000000..3ea969d8b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.cfg
@@ -0,0 +1,2 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.sql b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.sql
new file mode 100644
index 0000000000..46cc25e42e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort1.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+
+SELECT pd.Text, pd.PhraseID, m2.BaseNo
+ FROM Input2 as m2
+ INNER JOIN (select PhraseID, BaseNo, True as Text from Input1) as pd
+ USING (BaseNo, PhraseID)
+ORDER BY pd.PhraseID, m2.BaseNo;
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort2-off.cfg b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2-off.cfg
new file mode 100644
index 0000000000..01597c0916
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2-off.cfg
@@ -0,0 +1,4 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.cfg b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.cfg
new file mode 100644
index 0000000000..3ea969d8b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.cfg
@@ -0,0 +1,2 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.sql b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.sql
new file mode 100644
index 0000000000..b8d4f8e5f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_extrasort2.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+
+SELECT pd.Text, m2.BannerID
+ FROM (select BaseNo, PhraseID, 100 as BannerID from Input2) as m2
+ INNER JOIN (select PhraseID, BaseNo, 999 as Text from Input1) as pd
+ USING (BaseNo, PhraseID)
+ORDER BY pd.Text, m2.BannerID;
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_inner-off.cfg b/yt/yql/tests/sql/suites/join/premap_merge_inner-off.cfg
new file mode 100644
index 0000000000..287d1fa1ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_inner-off.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_inner.cfg b/yt/yql/tests/sql/suites/join/premap_merge_inner.cfg
new file mode 100644
index 0000000000..88a5beef60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_inner.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv2.txt
+in Input3 sorted_by_kv3.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_inner.sql b/yt/yql/tests/sql/suites/join/premap_merge_inner.sql
new file mode 100644
index 0000000000..2557b94ac4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_inner.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+
+from (select k1, v1 as u1 from Input1) as a
+join (select k2, v2 as u2 from Input2) as b on a.k1 = b.k2
+select a.k1,a.u1,b.u2
+order by a.k1,a.u1;
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_with_remap-off.cfg b/yt/yql/tests/sql/suites/join/premap_merge_with_remap-off.cfg
new file mode 100644
index 0000000000..01597c0916
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_with_remap-off.cfg
@@ -0,0 +1,4 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_with_remap.cfg b/yt/yql/tests/sql/suites/join/premap_merge_with_remap.cfg
new file mode 100644
index 0000000000..3ea969d8b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_with_remap.cfg
@@ -0,0 +1,2 @@
+in Input1 mergejoin_input1.txt
+in Input2 mergejoin_input2.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_merge_with_remap.sql b/yt/yql/tests/sql/suites/join/premap_merge_with_remap.sql
new file mode 100644
index 0000000000..6a582ffa76
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_merge_with_remap.sql
@@ -0,0 +1,17 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+pragma yt.JoinMergeUnsortedFactor="3.0";
+
+INSERT INTO @inp2
+SELECT * FROM Input2
+ORDER BY BaseNo DESC;
+
+COMMIT;
+
+SELECT pd.BaseNo, m2.PhraseID, m2.Extra
+ FROM Input1 as pd
+ LEFT JOIN (select BaseNo, PhraseID, 1 as Extra from @inp2) as m2
+ USING (BaseNo, PhraseID)
+ORDER BY pd.BaseNo, m2.PhraseID, m2.Extra;
diff --git a/yt/yql/tests/sql/suites/join/premap_no_premap-off.cfg b/yt/yql/tests/sql/suites/join/premap_no_premap-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_no_premap-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_no_premap.cfg b/yt/yql/tests/sql/suites/join/premap_no_premap.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_no_premap.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_no_premap.sql b/yt/yql/tests/sql/suites/join/premap_no_premap.sql
new file mode 100644
index 0000000000..533fa758ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_no_premap.sql
@@ -0,0 +1,27 @@
+PRAGMA DisableSimpleColumns;
+PRAGMA DisablePullUpFlatMapOverJoin;
+use plato;
+
+-- not renaming
+from (select key, subkey || key as subkey, value from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, b.value
+order by a.key;
+
+-- not fixed size
+from (select key, "aaa" as subkey, value from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, b.value
+order by a.key;
+
+-- to many Justs
+from (select key, Just(Just(1)) as subkey, value from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, b.value
+order by a.key;
+
+-- container
+from (select key, AsTuple(1) as subkey, value from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, b.value
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap-off.cfg b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.cfg b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.sql b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.sql
new file mode 100644
index 0000000000..0163d931ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/premap_nonseq_flatmap.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+$hashes = (
+ SELECT multiplier AS hash
+ FROM (SELECT ListFromRange(0, 3) AS multiplier)
+ FLATTEN BY multiplier
+);
+
+SELECT * FROM Input1 AS a CROSS JOIN $hashes AS h
+ORDER BY a.key,a.subkey,h.hash;
diff --git a/yt/yql/tests/sql/suites/join/pullup_context_dep-off.cfg b/yt/yql/tests/sql/suites/join/pullup_context_dep-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_context_dep-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_context_dep.cfg b/yt/yql/tests/sql/suites/join/pullup_context_dep.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_context_dep.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_context_dep.sql b/yt/yql/tests/sql/suites/join/pullup_context_dep.sql
new file mode 100644
index 0000000000..5c8b94fc25
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_context_dep.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value, TablePath() as tp from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, a.tp, b.value
+order by a.key, a.tp;
diff --git a/yt/yql/tests/sql/suites/join/pullup_cross-off.cfg b/yt/yql/tests/sql/suites/join/pullup_cross-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_cross-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_cross.cfg b/yt/yql/tests/sql/suites/join/pullup_cross.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_cross.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_cross.sql b/yt/yql/tests/sql/suites/join/pullup_cross.sql
new file mode 100644
index 0000000000..7b5f75f0ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_cross.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value || "v" as value from Input1) as a
+cross join Input2 as b
+select a.key, a.subkey, b.subkey, b.value
+order by a.key, a.subkey, b.subkey, b.value;
diff --git a/yt/yql/tests/sql/suites/join/pullup_exclusion-off.cfg b/yt/yql/tests/sql/suites/join/pullup_exclusion-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_exclusion-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_exclusion.cfg b/yt/yql/tests/sql/suites/join/pullup_exclusion.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_exclusion.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_exclusion.sql b/yt/yql/tests/sql/suites/join/pullup_exclusion.sql
new file mode 100644
index 0000000000..b865107bbf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_exclusion.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value from Input1) as a
+exclusion join (select key || subkey as subkey, key, 1 as value from Input2) as b on a.key = b.key
+select a.key as akey, b.key as bkey, a.subkey, b.subkey, b.value
+order by akey;
diff --git a/yt/yql/tests/sql/suites/join/pullup_inner-off.cfg b/yt/yql/tests/sql/suites/join/pullup_inner-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_inner-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_inner.cfg b/yt/yql/tests/sql/suites/join/pullup_inner.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_inner.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_inner.sql b/yt/yql/tests/sql/suites/join/pullup_inner.sql
new file mode 100644
index 0000000000..097302e12e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_inner.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value from Input1) as a
+join (select key || subkey as subkey, key, 1 as value from Input2) as b on a.key = b.key
+select a.key as akey, b.key as bkey, a.subkey, b.subkey, b.value
+order by akey;
diff --git a/yt/yql/tests/sql/suites/join/pullup_left-off.cfg b/yt/yql/tests/sql/suites/join/pullup_left-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_left.cfg b/yt/yql/tests/sql/suites/join/pullup_left.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_left.sql b/yt/yql/tests/sql/suites/join/pullup_left.sql
new file mode 100644
index 0000000000..1784fea6cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value from Input1) as a
+left join (select key || subkey as subkey, key, 1 as value from Input2) as b on a.key = b.key
+select a.key as akey, b.key as bkey, a.subkey, b.subkey, b.value
+order by akey;
diff --git a/yt/yql/tests/sql/suites/join/pullup_left_semi-off.cfg b/yt/yql/tests/sql/suites/join/pullup_left_semi-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left_semi-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_left_semi.cfg b/yt/yql/tests/sql/suites/join/pullup_left_semi.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left_semi.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_left_semi.sql b/yt/yql/tests/sql/suites/join/pullup_left_semi.sql
new file mode 100644
index 0000000000..feeec671b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_left_semi.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value from Input1) as a
+left semi join (select key || subkey as subkey, key, 1 as value from Input2) as b on a.key = b.key
+select a.key as akey, a.subkey
+order by akey;
diff --git a/yt/yql/tests/sql/suites/join/pullup_null_column-off.cfg b/yt/yql/tests/sql/suites/join/pullup_null_column-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_null_column-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_null_column.cfg b/yt/yql/tests/sql/suites/join/pullup_null_column.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_null_column.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_null_column.sql b/yt/yql/tests/sql/suites/join/pullup_null_column.sql
new file mode 100644
index 0000000000..d7a5c88783
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_null_column.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from Input1 as a
+left join (select key, null as subkey, 1 as value from Input2) as b on a.key = b.key
+select a.key as akey, b.key as bkey, a.subkey, b.subkey, b.value
+order by akey;
diff --git a/yt/yql/tests/sql/suites/join/pullup_random-off.cfg b/yt/yql/tests/sql/suites/join/pullup_random-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_random-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_random.cfg b/yt/yql/tests/sql/suites/join/pullup_random.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_random.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_random.sql b/yt/yql/tests/sql/suites/join/pullup_random.sql
new file mode 100644
index 0000000000..f884b2d8fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_random.sql
@@ -0,0 +1,8 @@
+/* kikimr can not - due to random */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value, RANDOM(value || "x") <= 1.0 as rn from Input1) as a
+join Input2 as b using(key)
+select a.key, a.subkey, a.rn, b.value
+order by a.key, a.rn;
diff --git a/yt/yql/tests/sql/suites/join/pullup_renaming-off.cfg b/yt/yql/tests/sql/suites/join/pullup_renaming-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_renaming-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_renaming.cfg b/yt/yql/tests/sql/suites/join/pullup_renaming.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_renaming.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_renaming.sql b/yt/yql/tests/sql/suites/join/pullup_renaming.sql
new file mode 100644
index 0000000000..0f13acd39f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_renaming.sql
@@ -0,0 +1,8 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key as akey1, key as akey2, subkey || key as subkey, value from Input1) as a
+left join (select key || subkey as subkey, key as bkey1, key as bkey2, 1 as value from Input2) as b
+on a.akey1 = b.bkey1 and a.akey1 = b.bkey2 and a.akey2 = b.bkey1
+select a.akey1 as akey1, b.bkey1 as bkey1, a.subkey, b.subkey, b.value
+order by akey1, bkey1;
diff --git a/yt/yql/tests/sql/suites/join/pullup_rownumber-off.cfg b/yt/yql/tests/sql/suites/join/pullup_rownumber-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_rownumber-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pullup_rownumber.cfg b/yt/yql/tests/sql/suites/join/pullup_rownumber.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_rownumber.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pullup_rownumber.sql b/yt/yql/tests/sql/suites/join/pullup_rownumber.sql
new file mode 100644
index 0000000000..a40f65b939
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pullup_rownumber.sql
@@ -0,0 +1,7 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from (select key, subkey || key as subkey, value, ROW_NUMBER() over w as rn from Input1 window w as ()) as a
+join Input2 as b using(key)
+select a.key, a.subkey, a.rn, b.value
+order by a.key, a.rn;
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict-off.cfg b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.cfg b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.sql b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.sql
new file mode 100644
index 0000000000..e6fd2ce9af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_assume_strict.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+-- should pushdown
+select * from Input1 as a inner join Input2 as b on a.key = b.key where AssumeStrict(Unwrap(cast(a.key as Int32))) > 100 order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.cfg b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.cfg
new file mode 100644
index 0000000000..75143a2d4b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+in Input2 input2.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.sql b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.sql
new file mode 100644
index 0000000000..12ab5e8f6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_inner_with_strict_udf.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+-- should pushdown
+select * from Input1 as a inner join Input2 as b on a.key = b.key where Math::IsFinite(cast(a.key as Double)) order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_left-off.cfg b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.cfg b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.sql b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.sql
new file mode 100644
index 0000000000..d5b8567576
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/pushdown_filter_over_left.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+-- should pushdown
+select * from Input1 as a left join Input2 as b on a.key = b.key where Unwrap(cast(a.key as Int32)) > 100 order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/right_trivial-off.cfg b/yt/yql/tests/sql/suites/join/right_trivial-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/right_trivial-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/right_trivial.cfg b/yt/yql/tests/sql/suites/join/right_trivial.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/right_trivial.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/right_trivial.sql b/yt/yql/tests/sql/suites/join/right_trivial.sql
new file mode 100644
index 0000000000..d63d52b615
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/right_trivial.sql
@@ -0,0 +1,5 @@
+PRAGMA DisableSimpleColumns;
+select coalesce(Input1.key, "_null") as a, coalesce(Input1.subkey, "_null") as b, coalesce(Input3.value, "_null") as c
+from plato.Input1
+right join plato.Input3 using (key)
+order by a, b, c; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/join/root.txt.attr b/yt/yql/tests/sql/suites/join/root.txt.attr
new file mode 100644
index 0000000000..8cfa8bc1a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/root.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["leaf";["OptionalType";["DataType";"Uint64"]]];
+ ["branch";["OptionalType";["DataType";"Uint64"]]];
+ ["value";["OptionalType";["DataType";"String"]]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted-off.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted-off.cfg
new file mode 100644
index 0000000000..579f91d547
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted-off.cfg
@@ -0,0 +1,4 @@
+in Input sorted_uniq.txt
+
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.cfg
new file mode 100644
index 0000000000..e6665422d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.cfg
@@ -0,0 +1,2 @@
+in Input sorted_uniq.txt
+
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.sql b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.sql
new file mode 100644
index 0000000000..dc33eadc98
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select * from plato.Input as a inner join plato.Input as b on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-off.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-off.cfg
new file mode 100644
index 0000000000..579f91d547
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-off.cfg
@@ -0,0 +1,4 @@
+in Input sorted_uniq.txt
+
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-replicate.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-replicate.cfg
new file mode 100644
index 0000000000..1aa0bdd86e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter-replicate.cfg
@@ -0,0 +1,6 @@
+in Input sorted_uniq.txt
+
+providers dq
+pragma dq.HashJoinMode="off";
+pragma dq.SplitStageOnDqReplicate="false";
+pragma dq.SpillingEngine="disable";
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.cfg
new file mode 100644
index 0000000000..e6665422d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.cfg
@@ -0,0 +1,2 @@
+in Input sorted_uniq.txt
+
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.sql b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.sql
new file mode 100644
index 0000000000..7134d1c830
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_filter.sql
@@ -0,0 +1,4 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+$in = (select * from plato.Input where key > "100");
+select * from $in as a inner join $in as b on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename-off.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename-off.cfg
new file mode 100644
index 0000000000..579f91d547
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename-off.cfg
@@ -0,0 +1,4 @@
+in Input sorted_uniq.txt
+
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.cfg b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.cfg
new file mode 100644
index 0000000000..e6665422d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.cfg
@@ -0,0 +1,2 @@
+in Input sorted_uniq.txt
+
diff --git a/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.sql b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.sql
new file mode 100644
index 0000000000..51746196d6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/selfjoin_on_sorted_with_rename.sql
@@ -0,0 +1,2 @@
+PRAGMA DisableSimpleColumns;
+select a.key as key, b.subkey as subkey, b.value as value from plato.Input as a inner join plato.Input as b on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/join/simple_columns_partial-off.cfg b/yt/yql/tests/sql/suites/join/simple_columns_partial-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/simple_columns_partial-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/simple_columns_partial.cfg b/yt/yql/tests/sql/suites/join/simple_columns_partial.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/simple_columns_partial.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/simple_columns_partial.sql b/yt/yql/tests/sql/suites/join/simple_columns_partial.sql
new file mode 100644
index 0000000000..da45ff2766
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/simple_columns_partial.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+use plato;
+pragma SimpleColumns;
+
+SELECT *
+FROM `Input2` AS a
+LEFT SEMI JOIN `Input3` AS b
+ON a.value == b.value;
+
+SELECT *
+FROM `Input2` AS a
+LEFT ONLY JOIN `Input3` AS b
+ON a.value == b.value;
+
+SELECT *
+FROM `Input2` AS a
+RIGHT SEMI JOIN `Input3` AS b
+ON a.value == b.value;
+
+SELECT *
+FROM `Input2` AS a
+RIGHT ONLY JOIN `Input3` AS b
+ON a.value == b.value;
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_k1.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_k1.txt.attr
new file mode 100644
index 0000000000..9cef99eb90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_k1.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_k2.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_k2.txt.attr
new file mode 100644
index 0000000000..39faeeb22c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_k2.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_key1.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_key1.txt.attr
new file mode 100644
index 0000000000..852ba949fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_key1.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "key";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_key2.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_key2.txt.attr
new file mode 100644
index 0000000000..852ba949fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_key2.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "key";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_key3.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_key3.txt.attr
new file mode 100644
index 0000000000..852ba949fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_key3.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "key";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_key4.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_key4.txt.attr
new file mode 100644
index 0000000000..852ba949fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_key4.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "key";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_key_subkey.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_key_subkey.txt.attr
new file mode 100644
index 0000000000..1752b0ee6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_key_subkey.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "key";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv1.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv1.txt.attr
new file mode 100644
index 0000000000..4185224ec0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv1.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv1_1.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv1_1.txt.attr
new file mode 100644
index 0000000000..4185224ec0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv1_1.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv1_dup.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv1_dup.txt.attr
new file mode 100644
index 0000000000..4185224ec0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv1_dup.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv1_opt.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv1_opt.txt.attr
new file mode 100644
index 0000000000..aee2f17230
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv1_opt.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv1_unique.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv1_unique.txt.attr
new file mode 100644
index 0000000000..6059c56833
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv1_unique.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %true
+ >
+ [
+ {
+ "name" = "k1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv2.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv2.txt.attr
new file mode 100644
index 0000000000..387ceb1b55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv2.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv2_dup.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv2_dup.txt.attr
new file mode 100644
index 0000000000..387ceb1b55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv2_dup.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv2_empty.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv2_empty.txt.attr
new file mode 100644
index 0000000000..387ceb1b55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv2_empty.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv2_opt.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv2_opt.txt.attr
new file mode 100644
index 0000000000..d10189b748
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv2_opt.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k2";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v2";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_by_kv3.txt.attr b/yt/yql/tests/sql/suites/join/sorted_by_kv3.txt.attr
new file mode 100644
index 0000000000..3b51f7ab03
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_by_kv3.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "k3";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "v3";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u3";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/sorted_uniq.txt.attr b/yt/yql/tests/sql/suites/join/sorted_uniq.txt.attr
new file mode 100644
index 0000000000..3cbe9af3fd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_uniq.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;];
+ "SortedBy"=["key";];
+ "SortedByTypes"=[["DataType";"String";];];
+ "SortMembers"=["key";];
+ "UniqueKeys"=%true;
+}}
diff --git a/yt/yql/tests/sql/suites/join/sorted_uniq1.txt.attr b/yt/yql/tests/sql/suites/join/sorted_uniq1.txt.attr
new file mode 100644
index 0000000000..fad1fb2801
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_uniq1.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["subkey";"value"];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["subkey";"value"];
+ "UniqueKeys"=%true;
+}}
diff --git a/yt/yql/tests/sql/suites/join/sorted_uniq2.txt.attr b/yt/yql/tests/sql/suites/join/sorted_uniq2.txt.attr
new file mode 100644
index 0000000000..09cc6be90d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/sorted_uniq2.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;];
+ "SortedBy"=["key"];
+ "SortedByTypes"=[["DataType";"String";]];
+ "SortMembers"=["key";];
+ "UniqueKeys"=%true;
+}}
diff --git a/yt/yql/tests/sql/suites/join/split_to_list_as_key-off.cfg b/yt/yql/tests/sql/suites/join/split_to_list_as_key-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/split_to_list_as_key-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/split_to_list_as_key.cfg b/yt/yql/tests/sql/suites/join/split_to_list_as_key.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/split_to_list_as_key.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/split_to_list_as_key.sql b/yt/yql/tests/sql/suites/join/split_to_list_as_key.sql
new file mode 100644
index 0000000000..64be5ae083
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/split_to_list_as_key.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+use plato;
+
+from Input1 as a
+join Input2 as b on a.key = String::SplitToList(b.key, "_")[0]
+select * order by a.key,a.subkey,b.subkey
diff --git a/yt/yql/tests/sql/suites/join/star_join-off.cfg b/yt/yql/tests/sql/suites/join/star_join-off.cfg
new file mode 100644
index 0000000000..64e0857bc5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join-off.cfg
@@ -0,0 +1,7 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join.cfg b/yt/yql/tests/sql/suites/join/star_join.cfg
new file mode 100644
index 0000000000..a884c15308
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join.sql b/yt/yql/tests/sql/suites/join/star_join.sql
new file mode 100644
index 0000000000..19c7c910ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+
+$rightSemi = select * from Input2 as b right semi join Input1 as a on a.v1 = b.v2 and a.k1 = b.k2;
+$leftOnly = select * from $rightSemi as rs left only join Input3 as c on rs.k1 = c.k3 and rs.v1 = c.v3;
+$right = select * from Input4 as d right join $leftOnly as lo on d.v4 = lo.v1 and lo.k1 = d.k4;
+$inner = select * from $right as r join any Input5 as e on r.k1 = e.k5 and e.v5 = r.v1;
+
+select * from $inner order by u1,u5;
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners-off.cfg b/yt/yql/tests/sql/suites/join/star_join_inners-off.cfg
new file mode 100644
index 0000000000..7859898010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners.cfg b/yt/yql/tests/sql/suites/join/star_join_inners.cfg
new file mode 100644
index 0000000000..086641db8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners.sql b/yt/yql/tests/sql/suites/join/star_join_inners.sql
new file mode 100644
index 0000000000..9396fe8f6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+from any Input2 as b
+join any Input1 as a on b.k2 = a.k1 and a.v1 = b.v2
+join any Input3 as c on a.k1 = c.k3 and c.v3 = a.v1
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_premap-off.cfg b/yt/yql/tests/sql/suites/join/star_join_inners_premap-off.cfg
new file mode 100644
index 0000000000..7859898010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_premap-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_premap.cfg b/yt/yql/tests/sql/suites/join/star_join_inners_premap.cfg
new file mode 100644
index 0000000000..086641db8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_premap.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_premap.sql b/yt/yql/tests/sql/suites/join/star_join_inners_premap.sql
new file mode 100644
index 0000000000..4cf67ca9ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_premap.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+pragma DisablePullUpFlatMapOverJoin;
+
+$a = select k1,v1,u1, 1 as t1 from Input1;
+$c = select k3,v3,u3, 3 as t3 from Input3;
+
+from any Input2 as b
+join any $a as a on b.k2 = a.k1 and a.v1 = b.v2
+join any $c as c on a.k1 = c.k3 and c.v3 = a.v1
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted-off.cfg b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted-off.cfg
new file mode 100644
index 0000000000..45c529ffa9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted-off.cfg
@@ -0,0 +1,5 @@
+in Input1 vk1_sorted.txt
+in Input2 vk2_sorted.txt
+in Input3 vk3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.cfg b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.cfg
new file mode 100644
index 0000000000..354c0f1d8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.cfg
@@ -0,0 +1,3 @@
+in Input1 vk1_sorted.txt
+in Input2 vk2_sorted.txt
+in Input3 vk3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.sql b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.sql
new file mode 100644
index 0000000000..9396fe8f6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_inners_vk_sorted.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+from any Input2 as b
+join any Input1 as a on b.k2 = a.k1 and a.v1 = b.v2
+join any Input3 as c on a.k1 = c.k3 and c.v3 = a.v1
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_mirror-off.cfg b/yt/yql/tests/sql/suites/join/star_join_mirror-off.cfg
new file mode 100644
index 0000000000..64e0857bc5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_mirror-off.cfg
@@ -0,0 +1,7 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_mirror.cfg b/yt/yql/tests/sql/suites/join/star_join_mirror.cfg
new file mode 100644
index 0000000000..a884c15308
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_mirror.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_mirror.sql b/yt/yql/tests/sql/suites/join/star_join_mirror.sql
new file mode 100644
index 0000000000..8aaf6431b0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_mirror.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+$leftSemi = select * from Input1 as a left semi join Input2 as b on b.k2 = a.k1 and a.v1 = b.v2;
+$rightOnly = select * from Input3 as c right only join $leftSemi as ls on ls.k1 = c.k3 and ls.v1 = c.v3;
+$left = select * from $rightOnly as ro left join Input4 as d on ro.v1 = d.v4 and d.k4 = ro.k1;
+$inner = select * from any Input5 as e join $left as l on e.k5 = l.k1 and l.v1 = e.v5;
+
+select * from $inner order by u1,u5;
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_multi-off.cfg b/yt/yql/tests/sql/suites/join/star_join_multi-off.cfg
new file mode 100644
index 0000000000..64e0857bc5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_multi-off.cfg
@@ -0,0 +1,7 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_multi.cfg b/yt/yql/tests/sql/suites/join/star_join_multi.cfg
new file mode 100644
index 0000000000..a884c15308
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_multi.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_multi.sql b/yt/yql/tests/sql/suites/join/star_join_multi.sql
new file mode 100644
index 0000000000..b6553ce006
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_multi.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+
+-- first Star JOIN chain
+$rightSemi = select * from Input2 as b right semi join Input1 as a on a.v1 = b.v2 and a.k1 = b.k2;
+$leftOnly = select * from $rightSemi as rs left only join Input3 as c on rs.k1 = c.k3 and rs.v1 = c.v3;
+$right = select * from Input4 as d right join $leftOnly as lo on d.v4 = lo.v1 and lo.k1 = d.k4;
+$chain1 = select * from $right as r join any Input5 as e on r.k1 = e.k5 and e.v5 = r.v1;
+
+-- second Star JOIN chain (mirror reflection of first one)
+$leftSemi = select * from Input1 as a1 left semi join Input2 as b1 on b1.k2 = a1.k1 and a1.v1 = b1.v2;
+$rightOnly = select * from Input3 as c1 right only join $leftSemi as ls on ls.k1 = c1.k3 and ls.v1 = c1.v3;
+$left = select * from $rightOnly as ro left join Input4 as d1 on ro.v1 = d1.v4 and d1.k4 = ro.k1;
+$chain2 = select * from any Input5 as e1 join $left as l on e1.k5 = l.k1 and l.v1 = e1.v5;
+
+
+select left.k1 as k1, right.v1 as v1 from
+$chain1 as left join $chain2 as right on left.k1 = right.k1 and left.v1 = right.v1
+order by k1,v1;
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly-off.cfg b/yt/yql/tests/sql/suites/join/star_join_semionly-off.cfg
new file mode 100644
index 0000000000..7859898010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly.cfg b/yt/yql/tests/sql/suites/join/star_join_semionly.cfg
new file mode 100644
index 0000000000..086641db8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly.sql b/yt/yql/tests/sql/suites/join/star_join_semionly.sql
new file mode 100644
index 0000000000..bd158ea86d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+from Input1 as a
+left semi join Input2 as b on a.k1 = b.k2
+left only join Input3 as c on a.k1 = c.k3
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly_premap-off.cfg b/yt/yql/tests/sql/suites/join/star_join_semionly_premap-off.cfg
new file mode 100644
index 0000000000..7859898010
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly_premap-off.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly_premap.cfg b/yt/yql/tests/sql/suites/join/star_join_semionly_premap.cfg
new file mode 100644
index 0000000000..086641db8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly_premap.cfg
@@ -0,0 +1,3 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
diff --git a/yt/yql/tests/sql/suites/join/star_join_semionly_premap.sql b/yt/yql/tests/sql/suites/join/star_join_semionly_premap.sql
new file mode 100644
index 0000000000..370490c9fd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_semionly_premap.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+pragma DisablePullUpFlatMapOverJoin;
+
+$a = select k1,v1,u1, 1 as t1 from Input1;
+$b = select k2,v2,u2, 2 as t2 from Input2;
+$c = select k3,v3,u3, 3 as t3 from Input3;
+
+from $a as a
+left semi join $b as b on a.k1 = b.k2
+left only join $c as c on a.k1 = c.k3
+select * order by u1
+
diff --git a/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.cfg b/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.cfg
new file mode 100644
index 0000000000..00227305fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.cfg
@@ -0,0 +1,5 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.sql b/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.sql
new file mode 100644
index 0000000000..94408a517e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/star_join_with_diff_complex_key.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+
+select *
+from Input1 as a
+join any Input2 as b on a.k1 = b.k2 AND a.v1 = b.v2
+join any Input3 as c on a.k1 = c.k3 AND a.v1 = c.v3
+left join Input4 as d on (c.v3, c.u3) = (d.v4, d.u4)
diff --git a/yt/yql/tests/sql/suites/join/starjoin_unused_keys.cfg b/yt/yql/tests/sql/suites/join/starjoin_unused_keys.cfg
new file mode 100644
index 0000000000..9a930ffe48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/starjoin_unused_keys.cfg
@@ -0,0 +1,6 @@
+in Input1 kv1_sorted.txt
+in Input2 kv2_sorted.txt
+in Input3 kv3_sorted.txt
+in Input4 kv4_sorted.txt
+in Input5 kv5_sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/starjoin_unused_keys.sql b/yt/yql/tests/sql/suites/join/starjoin_unused_keys.sql
new file mode 100644
index 0000000000..4f2d3d932d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/starjoin_unused_keys.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+use plato;
+pragma yt.JoinEnableStarJoin="true";
+
+select
+
+v3
+
+from any Input1 as a
+join any Input2 as b on (a.k1 = b.k2 and a.v1 = b.v2)
+join any Input3 as c on (a.k1 = c.k3 and a.v1 = c.v3)
+join Input4 as d on (a.k1 = d.k4)
+order by v3;
diff --git a/yt/yql/tests/sql/suites/join/strict_keys.cfg b/yt/yql/tests/sql/suites/join/strict_keys.cfg
new file mode 100644
index 0000000000..b54c86b56b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/strict_keys.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input1 sorted_by_kv1.txt
+in Input2 sorted_by_kv1_opt.txt
diff --git a/yt/yql/tests/sql/suites/join/strict_keys.sql b/yt/yql/tests/sql/suites/join/strict_keys.sql
new file mode 100644
index 0000000000..b9ca0641f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/strict_keys.sql
@@ -0,0 +1,10 @@
+/* custom error:Strict key type match requested, but keys have different types*/
+use plato;
+
+define subquery $strict() as
+ pragma StrictJoinKeyTypes;
+ select count(*) from Input1 as a join Input2 as b using(k1)
+end define;
+
+select count(*) from Input1 as a join Input2 as b using(k1);
+select * from $strict();
diff --git a/yt/yql/tests/sql/suites/join/three_equalities-off.cfg b/yt/yql/tests/sql/suites/join/three_equalities-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/three_equalities.cfg b/yt/yql/tests/sql/suites/join/three_equalities.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/three_equalities.sql b/yt/yql/tests/sql/suites/join/three_equalities.sql
new file mode 100644
index 0000000000..51637f9154
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities.sql
@@ -0,0 +1,12 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT * FROM
+ Input1 AS A
+JOIN
+ Input2 AS B
+ON
+ A.key == B.key AND
+ (cast(A.subkey AS int) + 1 == cast(B.subkey AS int)) AND
+ A.value == B.value
+ORDER BY A.key
+;
diff --git a/yt/yql/tests/sql/suites/join/three_equalities_paren-off.cfg b/yt/yql/tests/sql/suites/join/three_equalities_paren-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities_paren-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/three_equalities_paren.cfg b/yt/yql/tests/sql/suites/join/three_equalities_paren.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities_paren.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/three_equalities_paren.sql b/yt/yql/tests/sql/suites/join/three_equalities_paren.sql
new file mode 100644
index 0000000000..b1be3c32e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/three_equalities_paren.sql
@@ -0,0 +1,11 @@
+PRAGMA DisableSimpleColumns;
+USE plato;
+SELECT * FROM
+ Input2 AS A
+JOIN
+ Input4 AS B
+ON
+ (A.key == B.key) AND
+ (A.subkey == B.subkey) AND
+ (A.value == B.value)
+;
diff --git a/yt/yql/tests/sql/suites/join/trivial_view-off.cfg b/yt/yql/tests/sql/suites/join/trivial_view-off.cfg
new file mode 100644
index 0000000000..43f157699a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/trivial_view-off.cfg
@@ -0,0 +1,4 @@
+in Input1 view_input.txt
+in Input2 input.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/trivial_view.cfg b/yt/yql/tests/sql/suites/join/trivial_view.cfg
new file mode 100644
index 0000000000..3f072cc800
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/trivial_view.cfg
@@ -0,0 +1,2 @@
+in Input1 view_input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/join/trivial_view.sql b/yt/yql/tests/sql/suites/join/trivial_view.sql
new file mode 100644
index 0000000000..8534f3a0c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/trivial_view.sql
@@ -0,0 +1,9 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+SELECT a.v, b.value
+FROM `Input1` VIEW `ksv` AS a
+JOIN `Input2` AS b
+ON a.k == b.key
+ORDER BY a.v;
diff --git a/yt/yql/tests/sql/suites/join/two_aggrs.sql b/yt/yql/tests/sql/suites/join/two_aggrs.sql
new file mode 100644
index 0000000000..1be595ca17
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/two_aggrs.sql
@@ -0,0 +1,18 @@
+USE plato;
+
+PRAGMA yt.JoinMergeForce = "1";
+pragma yt.JoinMergeTablesLimit="10";
+
+$join =
+ SELECT a.key as key1, a.subkey as subkey1
+ FROM (SELECT * FROM Input8 WHERE subkey != "bar") AS a
+ JOIN (SELECT * FROM Input8 WHERE subkey != "foo") AS b
+ ON a.key = b.key AND a.subkey = b.subkey;
+
+SELECT key1, subkey1, count(*)
+FROM $join
+GROUP COMPACT BY subkey1, key1;
+
+SELECT key1, subkey1
+FROM $join
+GROUP COMPACT BY key1, subkey1;
diff --git a/yt/yql/tests/sql/suites/join/uniqkeys.txt.attr b/yt/yql/tests/sql/suites/join/uniqkeys.txt.attr
new file mode 100644
index 0000000000..e847d48e3e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/uniqkeys.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+ "UniqueKeys"=%true
+}}
diff --git a/yt/yql/tests/sql/suites/join/view_input.txt.attr b/yt/yql/tests/sql/suites/join/view_input.txt.attr
new file mode 100644
index 0000000000..22c3547210
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/view_input.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_ksv"="SELECT key as k, subkey as s, value as v FROM self";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/join/vk1_sorted.txt.attr b/yt/yql/tests/sql/suites/join/vk1_sorted.txt.attr
new file mode 100644
index 0000000000..068381b88f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/vk1_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "v1";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "k1";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u1";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/vk2_sorted.txt.attr b/yt/yql/tests/sql/suites/join/vk2_sorted.txt.attr
new file mode 100644
index 0000000000..ff5c200f6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/vk2_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "v2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "k2";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u2";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/vk3_sorted.txt.attr b/yt/yql/tests/sql/suites/join/vk3_sorted.txt.attr
new file mode 100644
index 0000000000..c399355613
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/vk3_sorted.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false
+ >
+ [
+ {
+ "name" = "v3";
+ "required" = %false;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "k3";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "string"
+ };
+ {
+ "name" = "u3";
+ "required" = %true;
+ "type" = "string"
+ }
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns-off.cfg b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.cfg b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.sql b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.sql
new file mode 100644
index 0000000000..543df58892
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-10654_pullup_with_sys_columns.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+PRAGMA DisableSimpleColumns;
+
+$src =
+ select key, subkey || key as subkey, value from Input
+ union all
+ select * from AS_TABLE(ListCreate(Struct<key:String,subkey:String,value:String>));
+
+select a.key, a.subkey, b.value
+from Input as a
+left join $src as b using(key)
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/join/yql-12022-off.cfg b/yt/yql/tests/sql/suites/join/yql-12022-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-12022-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-12022.cfg b/yt/yql/tests/sql/suites/join/yql-12022.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-12022.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-12022.sql b/yt/yql/tests/sql/suites/join/yql-12022.sql
new file mode 100644
index 0000000000..15766d3004
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-12022.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+DEFINE SUBQUERY $sub($name) AS
+ SELECT * FROM $name
+END DEFINE;
+
+SELECT a.key
+FROM $sub("Input") AS a
+INNER JOIN Input AS b
+ON a.key = b.key
+WHERE JoinTableRow().`a.subkey` == "wat"
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_left-off.cfg b/yt/yql/tests/sql/suites/join/yql-14829_left-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_left-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_left.cfg b/yt/yql/tests/sql/suites/join/yql-14829_left.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_left.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_left.sql b/yt/yql/tests/sql/suites/join/yql-14829_left.sql
new file mode 100644
index 0000000000..8e36a759e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_left.sql
@@ -0,0 +1,35 @@
+USE plato;
+
+pragma yt.JoinEnableStarJoin="true";
+
+insert into @x
+select Just('xxx') as id
+order by id;
+
+insert into @y
+select Just('yyy') as id
+order by id;
+
+insert into @a
+select Just('aaa') as id
+order by id;
+
+commit;
+
+
+$xy_left = (
+ SELECT
+ x.id AS id
+ FROM
+ ANY @x AS x
+ LEFT JOIN ANY @y AS y
+ ON x.id == y.id
+);
+
+SELECT
+ *
+FROM
+ ANY @a AS a
+ LEFT JOIN ANY $xy_left AS b
+ ON a.id == b.id;
+
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_leftonly-off.cfg b/yt/yql/tests/sql/suites/join/yql-14829_leftonly-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_leftonly-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_leftonly.cfg b/yt/yql/tests/sql/suites/join/yql-14829_leftonly.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_leftonly.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-14829_leftonly.sql b/yt/yql/tests/sql/suites/join/yql-14829_leftonly.sql
new file mode 100644
index 0000000000..50ef1bae40
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14829_leftonly.sql
@@ -0,0 +1,35 @@
+USE plato;
+
+pragma yt.JoinEnableStarJoin="true";
+
+insert into @x
+select Just('xxx') as id
+order by id;
+
+insert into @y
+select Just('yyy') as id
+order by id;
+
+insert into @a
+select Just('aaa') as id
+order by id;
+
+commit;
+
+
+$xy_leftonly = (
+ SELECT
+ x.id AS id
+ FROM
+ @x AS x
+ LEFT ONLY JOIN @y AS y
+ ON x.id == y.id
+);
+
+SELECT
+ *
+FROM
+ @a AS a
+ LEFT ONLY JOIN $xy_leftonly AS b
+ ON a.id == b.id;
+
diff --git a/yt/yql/tests/sql/suites/join/yql-14847-off.cfg b/yt/yql/tests/sql/suites/join/yql-14847-off.cfg
new file mode 100644
index 0000000000..86539293ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14847-off.cfg
@@ -0,0 +1,5 @@
+in Input1 input1.txt
+in Input2 input7.txt
+in Input3 input3.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-14847.cfg b/yt/yql/tests/sql/suites/join/yql-14847.cfg
new file mode 100644
index 0000000000..5cac58c60c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14847.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+in Input2 input7.txt
+in Input3 input3.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-14847.sql b/yt/yql/tests/sql/suites/join/yql-14847.sql
new file mode 100644
index 0000000000..25d2f0394f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-14847.sql
@@ -0,0 +1,23 @@
+USE plato;
+
+pragma yt.MapJoinLimit="1M";
+
+$t = (
+SELECT
+ l.key as key,
+ r.subkey as subkey,
+ l.value || r.value as value
+FROM
+ Input1 as l
+CROSS JOIN
+ Input2 as r
+);
+
+SELECT
+ l.*,
+ r.value as rvalue
+FROM
+ $t as l
+LEFT JOIN
+ Input3 as r
+ON l.key = coalesce("" || r.key, "")
diff --git a/yt/yql/tests/sql/suites/join/yql-16011.cfg b/yt/yql/tests/sql/suites/join/yql-16011.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-16011.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/yql-16011.sql b/yt/yql/tests/sql/suites/join/yql-16011.sql
new file mode 100644
index 0000000000..bb8698027d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-16011.sql
@@ -0,0 +1,27 @@
+USE plato;
+
+PRAGMA AnsiInForEmptyOrNullableItemsCollections = "true";
+PRAGMA yt.MapJoinLimit="1m";
+PRAGMA yt.LookupJoinLimit="64k";
+PRAGMA yt.LookupJoinMaxRows="100";
+
+
+insert into @T1
+select Just('fooo'u) as ID order by ID;
+
+insert into @T2
+select 't' as text, '{}'y as tags, 'foo' as ID
+order by ID;
+
+commit;
+
+
+$lost_ids = SELECT ID FROM @T2 WHERE ID NOT IN (SELECT ID FROM @T1);
+$lost_samples_after_align = SELECT * FROM @T2 WHERE ID IN $lost_ids;
+
+SELECT * FROM $lost_samples_after_align;
+
+SELECT
+ text || 'a' as text,
+ tags,
+FROM $lost_samples_after_align;
diff --git a/yt/yql/tests/sql/suites/join/yql-19081.cfg b/yt/yql/tests/sql/suites/join/yql-19081.cfg
new file mode 100644
index 0000000000..aaba13cbfa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-19081.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted_uniq.txt
+in Input2 sorted_uniq.txt
+in Input3 input1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/yql-19081.sql b/yt/yql/tests/sql/suites/join/yql-19081.sql
new file mode 100644
index 0000000000..215ba02fe4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-19081.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+pragma yt.JoinMergeTablesLimit="100";
+pragma yt.MapJoinLimit="10M";
+pragma yt.MaxReplicationFactorToFuseOperations="1";
+
+SELECT
+ a.key, a.subkey, c.value
+FROM Input1 as a
+JOIN /*+ merge() */ Input2 as b ON a.key = b.key AND a.subkey = b.subkey
+JOIN Input3 as c ON b.key = c.key AND b.subkey = c.subkey
+ORDER BY c.value;
diff --git a/yt/yql/tests/sql/suites/join/yql-4275-off.cfg b/yt/yql/tests/sql/suites/join/yql-4275-off.cfg
new file mode 100644
index 0000000000..3e2c239448
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-4275-off.cfg
@@ -0,0 +1,3 @@
+in Input yql-4275.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-4275.cfg b/yt/yql/tests/sql/suites/join/yql-4275.cfg
new file mode 100644
index 0000000000..4461be80f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-4275.cfg
@@ -0,0 +1 @@
+in Input yql-4275.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-4275.sql b/yt/yql/tests/sql/suites/join/yql-4275.sql
new file mode 100644
index 0000000000..99096a7bbd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-4275.sql
@@ -0,0 +1,10 @@
+PRAGMA DisableSimpleColumns;
+/* postgres can not */
+USE plato;
+
+SELECT
+*
+FROM Input as x1
+JOIN (select key ?? 4 as key from Input) as x2 on x1.key == x2.key
+WHERE x2.key == 4
+;
diff --git a/yt/yql/tests/sql/suites/join/yql-4275.txt.attr b/yt/yql/tests/sql/suites/join/yql-4275.txt.attr
new file mode 100644
index 0000000000..4c1e650192
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-4275.txt.attr
@@ -0,0 +1,40 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers"=["key";"subkey"];"SortedBy"=["key";"subkey"];"SortDirections"=[1;1];"SortedByTypes"=[["OptionalType";["DataType";"Int32"]];["OptionalType";["DataType";"String"]]];
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ];
+ [
+ "value";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/join/yql-8125-off.cfg b/yt/yql/tests/sql/suites/join/yql-8125-off.cfg
new file mode 100644
index 0000000000..76a2a2b6a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8125-off.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-8125.cfg b/yt/yql/tests/sql/suites/join/yql-8125.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8125.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-8125.sql b/yt/yql/tests/sql/suites/join/yql-8125.sql
new file mode 100644
index 0000000000..b3d81a5509
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8125.sql
@@ -0,0 +1,29 @@
+use plato;
+
+PRAGMA yt.JoinCollectColumnarStatistics="async";
+
+INSERT INTO @yang_ids
+SELECT
+ *
+ from Input
+ where subkey <= "3"
+ LIMIT 100;
+commit;
+
+INSERT INTO @yang_ids
+ SELECT
+ *
+ from Input as j
+ LEFT ONLY JOIN @yang_ids
+ USING(key);
+commit;
+
+INSERT INTO @yang_ids
+ SELECT
+ *
+ from Input as j
+ LEFT ONLY JOIN @yang_ids
+ USING(key);
+commit;
+
+select * from @yang_ids;
diff --git a/yt/yql/tests/sql/suites/join/yql-8131-off.cfg b/yt/yql/tests/sql/suites/join/yql-8131-off.cfg
new file mode 100644
index 0000000000..be399805c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8131-off.cfg
@@ -0,0 +1,2 @@
+in Input input_intersect.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/join/yql-8131.cfg b/yt/yql/tests/sql/suites/join/yql-8131.cfg
new file mode 100644
index 0000000000..32d89a04e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8131.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/join/yql-8131.sql b/yt/yql/tests/sql/suites/join/yql-8131.sql
new file mode 100644
index 0000000000..bcdb5aa485
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8131.sql
@@ -0,0 +1,14 @@
+/* kikimr can not */
+use plato;
+
+PRAGMA DisableSimpleColumns;
+PRAGMA yt.JoinCollectColumnarStatistics="async";
+PRAGMA yt.MinTempAvgChunkSize="0";
+PRAGMA yt.MapJoinLimit="1";
+
+SELECT *
+FROM (select distinct key,subkey from Input where cast(key as Int32) > 100 order by key limit 100) as a
+RIGHT JOIN (select key,value from Input where cast(key as Int32) < 500) as b
+USING(key)
+ORDER BY a.key,a.subkey,b.value;
+
diff --git a/yt/yql/tests/sql/suites/join/yql-8980-off.cfg b/yt/yql/tests/sql/suites/join/yql-8980-off.cfg
new file mode 100644
index 0000000000..61ca79e527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8980-off.cfg
@@ -0,0 +1,7 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql-8980.cfg b/yt/yql/tests/sql/suites/join/yql-8980.cfg
new file mode 100644
index 0000000000..5ffa9b00c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8980.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 input1.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/join/yql-8980.sql b/yt/yql/tests/sql/suites/join/yql-8980.sql
new file mode 100644
index 0000000000..e2701ee730
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql-8980.sql
@@ -0,0 +1,15 @@
+USE plato;
+
+$foo = (SELECT key, subkey, value IN ("wat", "bar") AS value FROM Input);
+
+SELECT
+ R0.key, R0.subkey, R0.value,
+ R1.key, R1.subkey, R1.value,
+ R2.key, R2.value
+FROM $foo AS R0
+LEFT JOIN $foo AS R1 ON
+ R0.subkey = R1.key
+LEFT JOIN $foo AS R2 ON
+ R1.subkey = R2.key
+ORDER BY R0.key;
+
diff --git a/yt/yql/tests/sql/suites/join/yql_465-off.cfg b/yt/yql/tests/sql/suites/join/yql_465-off.cfg
new file mode 100644
index 0000000000..e6a2551297
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql_465-off.cfg
@@ -0,0 +1,4 @@
+in a input1.txt
+in b input2.txt
+providers dq
+pragma Dq.HashJoinMode='off';
diff --git a/yt/yql/tests/sql/suites/join/yql_465.cfg b/yt/yql/tests/sql/suites/join/yql_465.cfg
new file mode 100644
index 0000000000..96c331a7fd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql_465.cfg
@@ -0,0 +1,2 @@
+in a input1.txt
+in b input2.txt
diff --git a/yt/yql/tests/sql/suites/join/yql_465.sql b/yt/yql/tests/sql/suites/join/yql_465.sql
new file mode 100644
index 0000000000..4054dc97c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/join/yql_465.sql
@@ -0,0 +1,3 @@
+PRAGMA DisableSimpleColumns;
+use plato;
+select * from (select * from a where a.key > "zzz") as a join b on a.key == b.key;